Python使用pandas pivot_选项卡求和和计数特定值

2024-04-25 08:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据帧

ACCOUNT AMOUNT STATUS 
1         -2      1
2         2       0
2         -1      0
1         2       1 
1         2       1

这是想转换成一个像

^{pr2}$

因此,如果AMOUNT>;或<;大于0,则基本上进行拆分,然后对结果进行计数和求和。我目前有以下,但无法得到正确的分割金额。在

Data = pd.pivot_table(trans, values =['Status', 'AMOUNT'], index = ['ACCOUNT'], aggfunc = {'Status':np.mean, 'AMOUNT': [np.sum, 'count'] } )

Tags: 数据ltgtdatastatusnptableaccount
3条回答

使用groupbyunstack可以更好地实现这一点。我还创建了一些额外的专栏,使事情更清楚。在

data = pd.DataFrame(
    [[1, -2, 1],
     [2, 2, 0],
     [2, -1, 0],
     [1,  2, 1],
     [1,  2, 1] 
    ],
    columns = ['ACCOUNT', 'AMOUNT', 'STATUS']
)

data['AMOUNT_POSITIVE'] = data['AMOUNT'] > 0
data['AMOUNT_ABSOLUTE'] = data['AMOUNT'].abs()

result = (data
          .groupby(["ACCOUNT", "STATUS", "AMOUNT_POSITIVE"])['AMOUNT_ABSOLUTE']
          .agg(['count', 'sum'])
          .unstack("AMOUNT_POSITIVE")
         )

print(result)

你得到了你的桌子:

^{pr2}$

使用np.sign
此函数根据值的符号返回-1/0/1的数组。本质上给了我一种方便的方法来识别小于、等于或大于零的事物。我在groupby语句中使用它,并使用agg来计算值的数目,求和得到总数。在按3个向量分组之后,我将得到一个3层多索引。我取消堆叠是为了获取最后一层,并将其旋转到列中。最后一层是sign层。在

df.groupby(
    ['ACCOUNT', 'STATUS', np.sign(df.AMOUNT)]
).AMOUNT.agg(['count', 'sum']).unstack()

               count    sum   
AMOUNT            -1  1  -1  1
ACCOUNT STATUS                
1       1          1  2  -2  4
2       0          1  1  -1  2

额外努力模拟OP的预期输出:
在这里,我也做同样的事情。但是我添加了几个步骤来重命名列、合并层并获取绝对值。在

^{pr2}$

这是尝试修复您的pivot_表

pd.pivot_table(df.assign(new=df.AMOUNT.gt(0)), values =['AMOUNT'], index = ['ACCOUNT','STATUS'],columns='new',aggfunc = { 'AMOUNT': [np.sum, 'count'] } ).abs()
Out[431]: 
               AMOUNT                  
                count         sum      
new             False True  False True 
ACCOUNT STATUS                         
1       1           1     2     2     4
2       0           1     1     1     2

相关问题 更多 >