Pandas透视表条件计数

5

I have a simple dataframe:

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命令是否可以实现这个目标呢?如果不行,最好的方法是什么?

提前感谢。

更新

只是为了更清晰地说明为什么我要避免使用filter解决方案。在我的真实而复杂的数据框中,我有其他列,如下所示:

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

我需要对“other”列求和,但是当我进行筛选时出现了以下情况:

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

在枢轴之前进行筛选 - BENY
谢谢@wen,但我试图避免使用过滤器。 - O Pardal
如果你考虑速度,先过滤再旋转是更快的。 - BENY
不知道这一点,但在我的情况下,我有其他的df列。由于这些其他列,我不能使用过滤器来排除行。我没有在问题正文中提到这一点,试图使它更清晰,但现在我意识到我是在误导人。我会更新问题正文,感谢你的帮助。 - O Pardal
2个回答

7

需要为条件 x>0 创建的所有 True 值的求和结果:

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
您可以在透视之前对数据框进行过滤:
pd.pivot_table(df.loc[df['value']>0], index='id',values='value',aggfunc='count')

谢谢,@zipa。我试图避免使用过滤器。我在更新中进行了更好的解释。无论如何还是谢谢。=] - O Pardal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接