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

如何基于相同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:10:38