Python Pandas - Groupby和make列值标题

时间:2018-01-23 13:33:41

标签: python pandas

我有一个数据框,它是一个组织列表(每个组织有多个行),其值与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

我希望将其纳入每个组织仅列出一次的格式,并将值列下的truefalse值作为新列标题(如下所示)(然后计算):

Organisation  True   False
A              3       3
B              2       0
C              0       2

目前代码是这样的:

sqlDf.groupby(['Organisation','Value']).size().reset_index(name='counts')

但这并不是我需要做的事情。

有什么建议吗?

2 个答案:

答案 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只允许您指定两个参数indexcolumns,因为您要汇总每个单元格的值数。