熊猫数据透视表有条件计数

时间:2018-03-16 14:36:04

标签: python-3.x pandas

我有一个简单的数据框:

df = pd.DataFrame({'id': ['a','a','a','b','b'],'value':[0,15,20,30,0]})
df
  id  value
0  a      0
1  a     15
2  a     20
3  b     30
4  b      0

我想要一个数值大于零的数据透视表。

我试过了:

raw = pd.pivot_table(df, index='id',values='value',aggfunc=lambda x:len(x>0))

但是回复了这个:

    value
id
a       3
b       2

我需要什么:

    value
id
a       2
b       1

我用groupby和filter阅读了很多解决方案。是否可以使用pivot_table命令实现此目的?如果不是,哪种方法最好?

提前致谢

更新

为了让我更清楚为什么我要避免使用过滤器解决方案。在我的真实和复杂的df中,我有其他列,如下:

df = pd.DataFrame({'id': ['a','a','a','b','b'],'value':[0,15,20,30,0],'other':[2,3,4,5,6]})
df
  id  other  value
0  a      2      0
1  a      3     15
2  a      4     20
3  b      5     30
4  b      6      0

我需要将列与其他'相加,但是当我过滤时我得到了这个:

df=df[df['value']>0]
raw = pd.pivot_table(df, index='id',values=['value','other'],aggfunc={'value':len,'other':sum})
    other  value
id
a       7      2
b       5      1

而不是:

    other  value
id
a       9      2
b      11      1

2 个答案:

答案 0 :(得分:5)

条件sum创建的计数True需要x>0

raw = pd.pivot_table(df, index='id',values='value',aggfunc=lambda x:(x>0).sum())
print (raw)
    value
id       
a       2
b       1

正如@Wen所提到的,另一个解决方案是:

df = df[df['value'] > 0]
raw = pd.pivot_table(df, index='id',values='value',aggfunc=len)

答案 1 :(得分:1)

您可以在透视之前过滤数据框:

pd.pivot_table(df.loc[df['value']>0], index='id',values='value',aggfunc='count')