如何基于相同t1列值替换df1的c1列值?(Pandas操作)
匹配两DataFrame的
t1列值,替换df1的c1列值 问题描述
现有两个列数相同、行数不同的Pandas DataFrame(df1和df2),需找到两数据帧中t1列值相同的行,将df1的c1列对应值替换为df2的c1列值。尝试过where、replace等函数,推测可通过merge或join类方法实现。
初始数据代码及状态
import pandas as pd df1 = pd.DataFrame() df2 = pd.DataFrame() # 填充c1列(收盘价) df1.at[0,"c1"]=0 df1.at[1,"c1"]=0 df1.at[2,"c1"]=0 df1.at[3,"c1"]=0 df1.at[4,"c1"]=0 df1.at[5,"c1"]=0 df1.at[6,"c1"]=0 df1.at[7,"c1"]=0 df2.at[0,"c1"]=20 df2.at[1,"c1"]=26 df2.at[3,"c1"]=23 df2.at[4,"c1"]=21 # 填充t1列(时间戳) df1.at[0,"t1"]=3 df1.at[1,"t1"]=4 df1.at[2,"t1"]=5 df1.at[3,"t1"]=6 df1.at[4,"t1"]=7 df1.at[5,"t1"]=8 df1.at[6,"t1"]=9 df1.at[7,"t1"]=10 df2.at[0,"t1"]=5 df2.at[1,"t1"]=6 df2.at[3,"t1"]=7 df2.at[4,"t1"]=8
初始状态输出:
df1
c1 t1
0 0.0 3.0
1 0.0 4.0
2 0.0 5.0
3 0.0 6.0
4 0.0 7.0
5 0.0 8.0
6 0.0 9.0
7 0.0 10.0
df2
c1 t1
0 20.0 5.0
1 26.0 6.0
3 23.0 7.0
4 21.0 8.0
期望输出
df1
c1 t1
0 0.0 3.0
1 0.0 4.0
2 20.0 5.0
3 26.0 6.0
4 23.0 7.0
5 21.0 8.0
6 0.0 9.0
7 0.0 10.0
解决方案
这里提供三种简洁的实现方式:
方法1:利用map+fillna
先从df2中构建t1到c1的映射关系,再通过map匹配替换,未匹配到的值用原df1的c1值填充:
# 构建t1到c1的映射字典 c1_mapping = df2.set_index('t1')['c1'] # 替换df1的c1列,未匹配项保留原值 df1['c1'] = df1['t1'].map(c1_mapping).fillna(df1['c1'])
方法2:使用merge合并后替换
通过左连接合并两个DataFrame,再用合并后的新值替换原df1的c1列:
# 左连接合并,仅保留df2的t1和c1列 merged_df = df1.merge(df2[['t1', 'c1']], on='t1', how='left', suffixes=('', '_new')) # 用新值替换,未匹配项保留原值 df1['c1'] = merged_df['c1_new'].fillna(merged_df['c1']) # 清理临时列 merged_df.drop('c1_new', axis=1, inplace=True)
方法3:使用update方法
将两个DataFrame的t1设为索引后,直接用df2的值更新df1:
# 临时将t1设为索引 df1.set_index('t1', inplace=True) df2.set_index('t1', inplace=True) # 用df2的c1列更新df1的对应行 df1.update(df2[['c1']]) # 恢复原索引 df1.reset_index(inplace=True)
以上三种方法均可实现需求,其中方法1代码最简洁,方法3效率较高(适合大数据量场景)。
内容的提问来源于stack exchange,提问作者dutchy12345
相关产品推荐
相关产品推荐

