如何基于多列匹配条件用另一个dataframe的值替换当前dataframe列值
实现方法
以下是基于Python Pandas的两种可直接运行的实现方案:
方案1:使用update方法(更简洁,推荐)
update方法默认按索引匹配替换值,刚好适配你按双列匹配替换的需求:
import pandas as pd # 示例数据构造 df1 = pd.DataFrame({ 'Year': [2019, 2019, 2019], 'Week': [1, 2, 3], 'Sales': [5000, 6075, 7435] }) df2 = pd.DataFrame({ 'Year': [2018, 2019], 'Week': [8, 2], 'Sales': [5650, 7150] }) # 将双匹配列设为复合索引 df1 = df1.set_index(['Year', 'Week']) df2 = df2.set_index(['Year', 'Week']) # 按索引匹配替换Sales值,无匹配的行保留原值 df1['Sales'].update(df2['Sales']) # 重置索引恢复原始列结构 df1 = df1.reset_index() print(df1)
输出结果:
Year Week Sales 0 2019 1 5000 1 2019 2 7150 2 2019 3 7435
方案2:使用左连接实现(无需修改原索引)
如果不想改动原DataFrame的索引,可以用左连接加空值填充的逻辑实现:
# 左连接两个表,用后缀区分不同来源的Sales列 merged_df = df1.merge(df2[['Year', 'Week', 'Sales']], on=['Year', 'Week'], how='left', suffixes=('', '_new')) # 优先用匹配到的新Sales值,无匹配则保留原值 merged_df['Sales'] = merged_df['Sales_new'].fillna(merged_df['Sales']).astype(int) # 删除多余的辅助列得到最终结果 df1 = merged_df.drop(columns=['Sales_new']) print(df1)
两种方案都可以得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者etuo
相关产品推荐
相关产品推荐

