分享
三行代码  ›  专栏  ›  技术社区  ›  Christian

pandas groupby和countif在多个列中

  •  1
  • Christian  · 技术社区  · 5 天前

    import pandas as pd
    # -- create a dataframe 
    list_columns = ['pet', 'grade', 'class']
    list_data = [
        ['dog', 'A', 'A'],
        ['cat', 'A', 'C'],
        ['dog', 'B', 'E'],
        ['mouse', 'C', 'A'],
        ['dog', 'A', 'B'],
        ['cat', 'B', 'E'],
        ['dog', 'C', 'D'],
        ['dog', 'A', 'C'],
        ]
    df_animals = pd.DataFrame(columns=list_columns, data=list_data)
    df_animals.head()
    

    'A','B','C','D','E' 在列中 grade class

    预期产出将是

    pet    status   grade   class
    dog      A      3       1
    dog      B      1       1
    dog      C      0       1
    dog      D      0       0
    dog      E      0       1
    cat      A      1       0
    cat      B      0       0
    cat      C      0       1
    cat      D      0       0
    cat      E      0       0
    mouse    A      0       1
    mouse    B      0       0
    mouse    C      1       0
    mouse    D      0       0
    mouse    E      0       0
    

    我试图按一个特定的项目进行分组和计数,但没有成功。 一个想法是计算每只宠物的A,B,C,D,E,但这是手动的,不认为这是好的。 有人能告诉我该怎么做吗?

    df_animals.groupby('grade').apply(lambda x: (x=='A').count())
    
    1 回复  |  直到 5 天前
        1
  •  1
  •   jezrael    5 天前

    使用 DataFrame.melt DataFrame.pivot_table DataFrame.reindex 具有 MultiIndex.from_product :

    df = (df_animals.melt('pet')
                   .pivot_table(index=['pet','value'],
                                columns='variable', 
                                aggfunc='size', 
                                fill_value=0)
                   .rename_axis(None, axis=1))
    df = df.reindex(pd.MultiIndex.from_product(df.index.levels), fill_value=0).reset_index()
    print (df)
          pet value  class  grade
    0     cat     A      0      1
    1     cat     B      0      1
    2     cat     C      1      0
    3     cat     D      0      0
    4     cat     E      1      0
    5     dog     A      1      3
    6     dog     B      1      1
    7     dog     C      1      1
    8     dog     D      1      0
    9     dog     E      1      0
    10  mouse     A      1      0
    11  mouse     B      0      0
    12  mouse     C      0      1
    13  mouse     D      0      0
    14  mouse     E      0      0