如何在Pandas DataFrame中对同ID指定行计算并调整Amount值
解决方案:处理Pandas DataFrame中相同ID的行
针对你需求中对相同ID行的处理,这里提供两种稳健的实现方式:
方法一:分组变换 + 条件赋值(高效推荐)
利用Pandas的分组功能计算每个ID的总金额,结合组内行的位置标记来更新Amount列:
import pandas as pd import numpy as np df1 = pd.DataFrame({ 'Date':['2022-01-02', '2022-01-02', '2022-01-02', '2022-01-02', '2022-01-03', '2022-01-03', '2022-01-03'], 'ID':[1200, 1200, 1400, 1500, 1300, 1300, 1500], 'Amount':[10, 1, 12, 11, 12.5, 0.5, 12] }) # 计算每个ID对应的总金额,保持原数据行数 id_total = df1.groupby('ID')['Amount'].transform('sum') # 标记当前行是否为该ID组内的第一行 is_first_row = df1.groupby('ID').cumcount() == 0 # 用np.where批量赋值:第一行取总和,其余行设为0 df1['Amount'] = np.where(is_first_row, id_total, 0) print(df1)
执行后输出:
Date ID Amount 0 2022-01-02 1200 11.0 1 2022-01-02 1200 0.0 2 2022-01-02 1400 12.0 3 2022-01-02 1500 11.0 4 2022-01-03 1300 13.0 5 2022-01-03 1300 0.0 6 2022-01-03 1500 12.0
方法二:逐行判断(适合理解逻辑)
如果需要更直观的逻辑展示,可以用apply逐行处理(大数据集下效率略低于方法一):
import pandas as pd df1 = pd.DataFrame({ 'Date':['2022-01-02', '2022-01-02', '2022-01-02', '2022-01-02', '2022-01-03', '2022-01-03', '2022-01-03'], 'ID':[1200, 1200, 1400, 1500, 1300, 1300, 1500], 'Amount':[10, 1, 12, 11, 12.5, 0.5, 12] }) # 预计算每个ID的总金额 id_sum_map = df1.groupby('ID')['Amount'].sum().to_dict() # 逐行更新Amount df1['Amount'] = df1.apply( lambda row: id_sum_map[row['ID']] if df1[df1['ID'] == row['ID']].index[0] == row.name else 0, axis=1 ) print(df1)
关于你尝试的偏移方法说明
用np.where结合偏移ID的方式容易出现边界问题(比如ID不连续、同一ID有超过两行的情况),而分组的方式能自动处理所有ID的分组逻辑,不管每个ID有多少行,都能保证第一行取总和,其余行设为0,适配性更强。
内容的提问来源于stack exchange,提问作者fjurt
相关产品推荐
相关产品推荐

