基于日期列将DataFrame指定列的值替换为另一个DataFrame的值
问题描述
现有两个Pandas DataFrame:
- df1包含
date、key1、key2列,数据如下:
date key1 key2 01/01/2020 0:00:00 1 11 01/01/2020 0:30:00 2 12 01/01/2020 1:00:00 3 13 01/01/2020 1:30:00 4 14
- df2包含
date、key1列,数据如下:
date key1 01/01/2020 0:00:00 888 01/01/2020 1:00:00 888
需求:根据date列匹配,将df1中对应日期的key1值替换为df2中的key1值,最终得到结果:
date key1 key2 01/01/2020 0:00:00 888 11 01/01/2020 0:30:00 2 12 01/01/2020 1:00:00 888 13 01/01/2020 1:30:00 4 14
解决方案
以下是几种高效实现的方法:
方法1:字典映射 + map
先将df2转换为date到key1的映射字典,再用map替换df1的key1,未匹配到的行保留原值:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ 'date': ['01/01/2020 0:00:00', '01/01/2020 0:30:00', '01/01/2020 1:00:00', '01/01/2020 1:30:00'], 'key1': [1, 2, 3, 4], 'key2': [11, 12, 13, 14] }) df2 = pd.DataFrame({ 'date': ['01/01/2020 0:00:00', '01/01/2020 1:00:00'], 'key1': [888, 888] }) # 构建映射字典 key_mapping = df2.set_index('date')['key1'].to_dict() # 替换并保留原值 df1['key1'] = df1['date'].map(key_mapping).fillna(df1['key1']).astype(int) print(df1)
方法2:左连接合并 + 填充
通过左连接合并两个DataFrame,用df2的key1填充匹配行,最后清理临时列:
# 左连接两个DataFrame merged = df1.merge(df2, on='date', how='left', suffixes=('', '_new')) # 替换key1,未匹配行保留原值 merged['key1'] = merged['key1_new'].fillna(merged['key1']).astype(int) # 删除临时列 result = merged.drop('key1_new', axis=1) print(result)
方法3:update直接修改
update方法会直接在df1上更新匹配到的行,操作更简洁:
# 将df2设置date为索引,方便匹配 df2.set_index('date', inplace=True) # 用df2的key1更新df1的对应行 df1.set_index('date', inplace=True) df1.update(df2) df1.reset_index(inplace=True) # 转换为整数类型(update后可能变为float) df1['key1'] = df1['key1'].astype(int) print(df1)
内容的提问来源于stack exchange,提问作者RoDevelop
相关产品推荐
相关产品推荐

