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