Python Pandas:两个DataFrame间的数值映射最优实现方案
基于(id, time_by_hour)组合匹配填充DataFrame数值
需求说明
我有两个DataFrame:df1和df2,需要针对df1的每一行,在df2中匹配(id, time_by_hour)的组合,将df2中对应的数值填充到df1的value列位置,最终得到完整的df1_final。
当前df1的样例数据
id time_by_min time_by_hour value 0 a 2017-06-30 01:25:00.000 2017-06-30 02:00:00 NaN 1 a 2017-06-30 01:36:32.308 2017-06-30 02:00:00 NaN 2 a 2017-06-30 02:...
解决方案
这里推荐几种Pandas常用的实现方式,按需选择即可:
基础merge合并法(最直观高效):
直接以id和time_by_hour作为连接键,将df2的数值列合并到df1,再替换原value列:# 假设df2中存储目标数值的列名为target_value df1_final = df1.merge(df2[['id', 'time_by_hour', 'target_value']], on=['id', 'time_by_hour'], how='left') # 替换原value列并清理临时列 df1_final['value'] = df1_final['target_value'] df1_final = df1_final.drop(columns=['target_value'])简洁assign赋值法:
无需额外处理列,直接通过assign完成赋值:df1_final = df1.assign( value=df1.merge(df2, on=['id', 'time_by_hour'], how='left')['target_value'] )字典映射法:
先把df2转换成以(id, time_by_hour)为键的字典,再用apply+map匹配赋值:value_map = df2.set_index(['id', 'time_by_hour'])['target_value'].to_dict() df1_final = df1.copy() df1_final['value'] = df1_final.apply(lambda row: value_map.get((row['id'], row['time_by_hour'])), axis=1)
注意事项
- 务必确保
df1和df2中的time_by_hour列数据类型完全一致(比如都是datetime类型,避免一个是字符串一个是datetime),否则会出现匹配失败的情况。 - 如果
df2中存在多组相同的(id, time_by_hour)组合,merge会生成重复行,此时需要先对df2做去重或聚合处理(比如取均值、最大值等)。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

