我有一个数据框,它是一个组织列表(每个组织有多个行),其值与boolean
相关联。
因此,组织A有3 true
行和3 false
,即
Organisation Value
A True
A True
A False
A False
A True
A False
B True
B True
C False
C False
我希望将其纳入每个组织仅列出一次的格式,并将值列下的true
和false
值作为新列标题(如下所示)(然后计算):
Organisation True False
A 3 3
B 2 0
C 0 2
目前代码是这样的:
sqlDf.groupby(['Organisation','Value']).size().reset_index(name='counts')
但这并不是我需要做的事情。
有什么建议吗?
答案 0 :(得分:3)
您可以使用参数fill_value=0
添加unstack
,如果值的重要排序将sort=False
添加到groupby
:
df = df.groupby(['Organisation','Value'], sort=False).size().unstack(fill_value=0)
print (df)
Value True False
Organisation
A 3 3
B 2 0
C 0 2
df = (
df.groupby(['Organisation','Value'], sort=False)
.size()
.unstack(fill_value=0)
.reset_index()
.rename_axis(None, axis=1)
)
print (df)
Organisation True False
0 A 3 3
1 B 2 0
2 C 0 2
答案 1 :(得分:2)
选项1
pd.crosstab
-
pd.crosstab(df.Organisation, df.Value)
Value False True
Organisation
A 3 3
B 0 2
C 2 0
选项2
具有get_dummies
-
df.Organisation.str.get_dummies().T.dot(pd.get_dummies(df.Value))
False True
A 3 3
B 0 2
C 2 0
归功于@piRSquared,一段时间从他身上挑选了这个巧妙的技巧,并在迄今为止的几个答案中使用了它。
选项3
索引上的get_dummies
+ sum
-
pd.get_dummies(df.set_index('Organisation').Value).sum(level=0)
False True
Organisation
A 3 3
B 0 2
C 2 0
选项4
与jezrael相似,但使用value_counts
并且只在一列上使用组,因此它应该具有高性能。
df.groupby('Organisation').Value.value_counts().unstack(fill_value=0)
Value False True
Organisation
A 3 3
B 0 2
C 2 0
选项5
pivot_table
df.pivot_table(index='Organisation', columns='Value', aggfunc='size', fill_value=0)
Value False True
Organisation
A 3 3
B 0 2
C 2 0
在这种情况下,pivot_table
只允许您指定两个参数index
和columns
,因为您要汇总每个单元格的值数。