我有以下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'
列中有多少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())
答案 0 :(得分:1)
使用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