熊猫groupby和countif在多列中

时间:2020-06-30 06:12:23

标签: python pandas

我有以下df

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'列中有多少gradeclass列中有多少。

预期输出为

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 个答案:

答案 0 :(得分:1)

使用DataFrame.meltDataFrame.pivot_table进行整形,然后使用DataFrame.reindexMultiIndex.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
相关问题