Pandas/Python中带条件的groupby和

Pandas/Python中带条件的groupby和,python,pandas,numpy,Python,Pandas,Numpy,你有吗 你想要什么 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 试图创建一个新的列“CALCULATION”,但逻辑有点复杂。 根据ID、REL_NUM和HDR_NUM字段,计算应为金额字段的总和

你有吗

你想要什么

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    
试图创建一个新的列“CALCULATION”,但逻辑有点复杂。 根据ID、REL_NUM和HDR_NUM字段,计算应为金额字段的总和

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

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

需要更新的示例代码。我首先尝试了groupby,但我很难让它满足上述两个步骤:

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)

您可以使用
.map
实现这一点。对于第二个,您需要groupby来获取每个
'REL_NUM'

df_want['CALCULATION']=df_have.groupby(['ID','HDR_NUM'])['AMT'].transform('sum')+ ?
输出:(为清晰起见,保留辅助列)
如果因为
HDR\u NUM==ID==REL\u NUM
而不想复制
AMT
,则只能对
groupby
的子集求和,这样就不会重复计算:

   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
输出:(交换了第一行和最后一行的ID)
谢谢@ALollz,一个跟进,假设第一个ID是2,最后一个ID是3。在这种情况下,我希望计算值为0.02+2.00。使用您的方法,它将复制0.02条目,因为num1=0.02,num2=2.02。你能满足这个例外吗?谢谢@ALollz,如果可能的话,最后一次更新。ID前面还有一列称为CONTRACT,它从一组更大的行中标识该行子集(即,对于上面所有5行,CONTRACT列都是1,但对于接下来的几行,CONTRACT列都是2,以此类推)。当我们运行num1(和num2)时,我们希望它引用该特定契约的ID列。尝试了df['num1']=df.HDR_NUM.map(df.set_index(['CONTRACT','ID']).AMT),但结果是NULLs@babz我认为最好用一个新问题来回答这个问题,因为它有点复杂。
   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
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    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