You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:45:48