我正在尝试使用两列重新整形数据框: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相同(无)
答案 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_dummies
,sum
与level=0
或groupby
与sum
:
df.set_index('ID')['Animal'].str.get_dummies().sum(level=0)
OR
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
使用pivot_table并指定:
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