我有一个简单的数据框:
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
答案 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')