如何用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
相关产品推荐
相关产品推荐

