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

如何用Pandas从第二个DataFrame更新指定列的值?

如何用另一个DataFrame更新指定列的值?

嘿,针对你这个用df2更新df1中value1列的需求,我整理了几种简单好用的方法,先把场景再明确下:

我们有df1,包含日期和三个数值列:

import pandas as pd

df1 = pd.DataFrame({
    'date': ['20100101', '20100102', '20100103', '20100104', '20100105', '20100106', '20100107'],
    'value1': [1,1,1,1,1,1,1],
    'value2': [2,2,2,3,3,3,3],
    'value3': [3,3,3,4,4,5,6]
})

还有df2,只存了需要更新的日期和对应的value1新值:

df2 = pd.DataFrame({
    'date': ['20100102', '20100104', '20100105', '20100106', '20100107'],
    'value1': [2,3,4,5,6]
})

目标是:只有df1中与df2日期匹配的行,才把value1替换成df2的新值,其他行保持原样,最终得到你想要的结果。

下面是三种实用的实现方式:


方法1:用update()原地更新(最推荐)

这是Pandas专门用来做这种局部更新的方法,步骤很简单:

# 先把两个DataFrame的date设为索引,方便匹配
df1.set_index('date', inplace=True)
df2.set_index('date', inplace=True)

# 用df2的value1更新df1的对应列,只更新匹配到的行
df1.update(df2)

# 把date恢复成普通列
df1.reset_index(inplace=True)

这个方法的好处是原地修改,不用额外创建新的DataFrame,而且只会替换匹配到的行的指定列,其他列和未匹配的行完全不受影响,效率很高。


方法2:用字典映射灵活替换

如果需要更灵活的逻辑(比如自定义未匹配行的处理),可以把df2转成字典,再用map()来替换:

# 将df2转换为 {date: new_value1} 的字典
value_mapping = df2.set_index('date')['value1'].to_dict()

# 替换df1的value1:匹配到日期就用字典里的新值,没匹配到就保留原值
df1['value1'] = df1['date'].map(value_mapping).fillna(df1['value1'])

这种方式自由度更高,比如你可以把fillna()换成其他逻辑,比如替换成默认值之类的。


方法3:用merge()合并后替换

如果需要同时查看原数值和新数值,或者要做更复杂的合并逻辑,可以用左合并的方式:

# 左合并df1和df2,保留df1所有行,给两列value1加后缀区分
merged_df = df1.merge(df2, on='date', how='left', suffixes=('_original', '_new'))

# 替换逻辑:如果有新值就用新值,否则用原值
merged_df['value1'] = merged_df['value1_new'].fillna(merged_df['value1_original'])

# 整理成目标格式的DataFrame
updated_df1 = merged_df[['date', 'value1', 'value2', 'value3']]

这个方法会生成中间合并表,适合需要做额外校验的场景,但内存占用会比前两种稍高一点。


这三种方法都能完美实现你的需求,其中update()方法最简洁高效,优先推荐使用哦!

内容的提问来源于stack exchange,提问作者Kevin Fang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:14:19