【问题标题】:groupby sum in Pandas/Python with conditions带有条件的 Pandas/Python 中的 groupby sum
【发布时间】:2018-10-16 04:13:08
【问题描述】:

df_have

ID  AMT     REL_NUM HDR_NUM
3   0.02    2.0      2.0    
4   2.00    2.0      4.0    
5   0.00    1.0      5.0    
1   0.00    5.0      1.0    
2   19.7    1.0      2.0    

df_want

ID  AMT     REL_NUM HDR_NUM CALCULATION
3   0.02    2.0      2.0      (19.7+0.02+2.00)
4   2.00    2.0      4.0      (2.00)
5   0.00    1.0      5.0      (0.00+0.00)
1   0.00    5.0      1.0      (0.00+19.7)
2   19.7    1.0      2.0      (19.7+0.02+2.00)

尝试创建一个新列“计算”,但逻辑有点棘手。 计算应该是依赖于 ID、REL_NUM 和 HDR_NUM 字段的 AMT 字段的 SUM。

第 1 步 - 检查 HDR_NUM 字段并获取相应的 AMT 值,其中 ID=HDR_NUM 第 2 步 - 添加所有 AMT 字段,其中 REL_NUM= HDR_NUM

对于第一行,这将是对 ID= 2,3 和 4 的 AMT 字段求和。

需要更新的示例代码。我先尝试了一个 groupby,但我无法让它同时满足上述两个步骤:

df_want['CALCULATION']=df_have.groupby(['ID','HDR_NUM'])['AMT'].transform('sum')+ ?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    您可以通过.map 实现此目的。对于第二个,您需要 groupby 以获取每个 'REL_NUM' 中的总和

    df['num1'] = df.HDR_NUM.map(df.set_index('ID').AMT)
    df['num2'] = df.HDR_NUM.map(df.groupby('REL_NUM').AMT.sum())
    
    df['calculation'] = df.num1.add(df.num2, fill_value=0)
    

    输出:(为清楚起见,保留帮助列)

       ID    AMT  REL_NUM  HDR_NUM  num1   num2  calculation
    0   3   0.02      2.0      2.0  19.7   2.02        21.72
    1   4   2.00      2.0      4.0   2.0    NaN         2.00
    2   5   0.00      1.0      5.0   0.0   0.00         0.00
    3   1   0.00      5.0      1.0   0.0  19.70        19.70
    4   2  19.70      1.0      2.0  19.7   2.02        21.72
    

    如果您不想重复AMT,因为HDR_NUM == ID == REL_NUM,您只能为groupby 求和一个子集,以免重复计算:

    df['num1'] = df.HDR_NUM.map(df.set_index('ID').AMT)
    df['num2'] = df.HDR_NUM.map(df[df.REL_NUM != df.ID].groupby('REL_NUM').AMT.sum())
    df['calculation'] = df.num1.add(df.num2, fill_value=0)
    

    输出:(交换第一行和最后一行的 ID)

       ID    AMT  REL_NUM  HDR_NUM  num1  num2  calculation
    0   2   0.02      2.0      2.0  0.02   2.0         2.02
    1   4   2.00      2.0      4.0  2.00   NaN         2.00
    2   5   0.00      1.0      5.0  0.00   0.0         0.00
    3   1   0.00      5.0      1.0  0.00  19.7        19.70
    4   3  19.70      1.0      2.0  0.02   2.0         2.02
    

    【讨论】:

    • 感谢@ALollz,跟进,假设第一个 ID 为 2,最后一个 ID 为 3。在这种情况下,我希望 CALCULATION 为 0.02+2.00。使用您的方法,它将复制 0.02 条目,因为 num1=0.02 和 num2=2.02。你能满足这个例外吗?
    • 感谢@ALollz,如果可能的话,最后一次更新。在 ID 之前还有一个名为 CONTRACT 的列,它从更大的一组行中标识该行子集(即,对于上面的所有 5 行,CONTRACT 列将全部为 1,但对于接下来的几行,将是 2,等等)。当我们运行 num1(和 num2)时,我们希望它引用该特定 CONTRACT 的 ID 列。试过 df['num1'] = df.HDR_NUM.map(df.set_index(['CONTRACT','ID']).AMT) 但这导致所有 NULLs
    • @babz 我认为这会在一个新问题中得到更好的回答,因为它有点涉及。
    猜你喜欢
    • 2016-02-06
    • 2021-04-30
    • 1970-01-01
    • 2020-10-05
    • 2017-12-18
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    相关资源
    最近更新 更多