将pandas数据帧从分类重塑为计数

时间:2017-07-17 17:41:01

标签: python pandas

我正在尝试使用两列重新整形数据框:ID和分类,以便每个唯一的分类值都有一列。

这就是我所拥有的:

   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相同(无)

2 个答案:

答案 0 :(得分:5)

我们可以使用crosstab()方法:

In [17]: pd.crosstab(df.ID, df.Animal).rename_axis(None, axis=1)
Out[17]:
     cat  cow  dog
ID
bar    1    0    0
baz    1    0    0
biz    0    1    2
foo    1    0    1

答案 1 :(得分:3)

使用.str.get_dummiessumlevel=0groupbysum

选项1

df.set_index('ID')['Animal'].str.get_dummies().sum(level=0)

OR

选项2

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

选项3

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

使用pivot_table并指定:

选项4

 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