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