根据条件汇总一列数据框的计数和值总计

问题描述

我有一个数据框,其中包含(比如说)不同产品的发票明智价格调整值。

例如:

df = pd.DataFrame({'col1': ['A','A','B','C','A'],'sum'  : [10,-10,10,0]})

我需要为 col1 = 'A' 创建一个汇总表,例如下:

           Count    Value
Positve
Negative
NIL

截至目前,我是这样做的:

result = pd.DataFrame(columns=['Count','Value'],index=['Positve','Negative','NIL'])
result.iloc[0,0] = df[(df['col1'] = 'A') & (df['sum'] > 0)]['sum'].count()
result.iloc[0,1] = df[(df['col1'] = 'A') & (df['sum'] > 0)]['sum'].sum()
result.iloc[1,0] = df[(df['col1'] = 'A') & (df['sum'] < 0)]['sum'].count()
result.iloc[1,1] = df[(df['col1'] = 'A') & (df['sum'] < 0)]['sum'].sum()
result.iloc[2,0] = df[(df['col1'] = 'A') & (df['sum'] == 0)]['sum'].count()
result.iloc[2,1] = df[(df['col1'] = 'A') & (df['sum'] == 0)]['sum'].sum()

有没有更好更快的方法来代替为汇总表中的每个值编写一行代码?我想不出这里有什么。

解决方法

首先使用 np.signSeries.map 映射到新列,然后仅过滤 A 并按命名将 countGroupBy.agg 中的 sum 聚合聚合:

df['new'] = np.sign(df['sum']).map({0:'NIL',1:'POS',-1:'NEG'})

df1 = df[df['col1'].eq('A')].groupby('new').agg(Count=('new','size'),Val=('sum','sum'))
print (df1)
     Count  Val
new            
NEG      2  -20
NIL      2    0
POS      2   20

如果需要计算所有值,则向 groupby 添加另一列:

df2 = df.groupby(['col1','new']).agg(Count=('new','sum'))
print (df2)
          Count  Val
col1 new            
A    NEG      2  -20
     NIL      2    0
     POS      2   20
B    POS      2   20
C    NEG      1  -10
     NIL      1    0