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

Pandas:如何根据ID和条件替换面板数据集中的列值

高效实现面板数据按ID替换为指定年份值

原始数据

IDyearvalue
120028
120039
1200410
2200211
2200311
2200412

目标结果

IDyearvalue
1200210
1200310
1200410
2200212
2200312
2200412

高效解决方案

方法1:字典映射法(性能最优)

先提取2004年的ID-值映射关系,再直接通过map替换整列,避免合并操作的性能损耗:

import pandas as pd

# 构造原始DataFrame(实际使用时替换为你的数据)
df = pd.DataFrame({
    'ID': [1,1,1,2,2,2],
    'year': [2002,2003,2004,2002,2003,2004],
    'value': [8,9,10,11,11,12]
})

# 生成ID到2004年value的字典
id_to_2004_val = df[df['year'] == 2004].set_index('ID')['value'].to_dict()

# 替换所有行的value为对应ID的2004年值
df['value'] = df['ID'].map(id_to_2004_val)

方法2:groupby + transform(代码简洁)

利用groupby的transform方法,将每个分组内2004年的值广播到该组所有行:

df['value'] = df.groupby('ID')['value'].transform(
    lambda x: x[df.loc[x.index, 'year'] == 2004].iloc[0]
)

性能说明

合并操作需要进行数据对齐、索引匹配等额外步骤,时间复杂度较高;而上述两种方法要么基于字典的O(1)映射,要么基于分组的广播操作,能大幅减少计算开销,尤其在处理百万级以上的大型数据集时,性能差异会非常明显。

内容的提问来源于stack exchange,提问作者jan.sfr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:45:56