我有以下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())
使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句