Python 将数据帧从分类改为计数
我试图用两列来重塑一个数据框:ID和categorical,这样每个唯一的categorical值都有一列 以下是我所拥有的:Python 将数据帧从分类改为计数,python,pandas,Python,Pandas,我试图用两列来重塑一个数据框:ID和categorical,这样每个唯一的categorical值都有一列 以下是我所拥有的: ID Animal foo cat foo dog bar cat baz cat biz dog biz cow biz dog 以下是我想要的: ID cat dog cow foo 1 1 0 bar 1 0 0 baz 1 0 0 biz 0 1 2 我试过: d
ID Animal
foo cat
foo dog
bar cat
baz cat
biz dog
biz cow
biz dog
以下是我想要的:
ID cat dog cow
foo 1 1 0
bar 1 0 0
baz 1 0 0
biz 0 1 2
我试过:
df.groupby(by='ID').count()
其中:
Index Animal
foo 2
bar 1
baz 1
biz 3
我还尝试:
df.pivot_table(values='Animal')
df.stack(level='Animal')
前者抛出DataError:没有要聚合的数字类型,后者抛出KeyError:Level Animal必须与name相同(无)我们可以使用方法:
使用
.str.get_dummies
,sum
和level=0
或groupby
和sum
:
选择1
或
选择2
输出:
cat cow dog
ID
bar 1 0 0
baz 1 0 0
biz 0 1 2
foo 1 0 1
选择3
使用pivot_表并分配:
选择4
这是个杀手+1下面是它如何与groupby一起工作:
df.groupby(['ID','Animal']).size().unstack('Animal',fill\u value=0)
但是使用交叉表-它更快、更地道。@ayhan,为了方便起见,请把你的评论变成答案completenes@MaxU我想我们需要一个规范的问题,不要每次都列出这些可能性:)这个标签需要清理一下,所以我不回答。@ayhan,这是真的。但通常情况下,再次回答比寻找合适的问题/答案要容易得多…;-)啊,见鬼,就用@MaxU的解决方案吧。;-)
df.set_index('ID')['Animal'].str.get_dummies().sum(level=0)
df.set_index('ID')['Animal'].str.get_dummies().groupby('ID').sum()
cat cow dog
ID
bar 1 0 0
baz 1 0 0
biz 0 1 2
foo 1 0 1
df.set_index(['ID','Animal'],append=True).assign(count=1)['count'].unstack(fill_value=0).sum(level=1)
Animal cat cow dog
ID
bar 1 0 0
baz 1 0 0
biz 0 1 2
foo 1 0 1
pd.pivot_table(df.assign(count=1),values='count',index='ID',columns='Animal',aggfunc='sum',fill_value=0)
Animal cat cow dog
ID
bar 1 0 0
baz 1 0 0
biz 0 1 2
foo 1 0 1