Python 将数据帧从分类改为计数

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和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
我试过:

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