如何基于另一DataFrame列条件匹配创建允许重复值的DataFrame新列
问题原因分析
原来的写法不符合Pandas的索引对齐规则:df1.loc[:, 'datetime'] == df2.loc[:, 'datetime'] 是按两个Series的行索引逐行对比,只有索引位置相同且时间值相等的行才会返回True,因此你只能拿到df2中索引为0的value3值,赋值回df1时自然只有索引为0的行能匹配到值,其余行因为索引不匹配被赋值为NaN,并非.loc方法本身错误。
高效解决方案
以下两种方法均为Pandas内置的向量化操作,无嵌套循环,性能远高于遍历写法,且不会触发官方警告。
方法1:map映射(推荐,单字段匹配场景最简洁)
因为df2的datetime列无重复值,可以直接构建时间到目标值的映射关系,直接映射赋值:
# 构建以datetime为索引、value3为值的映射Series value3_map = df2.set_index('datetime')['value3'] # 为df1匹配赋值 df1['value3'] = df1['datetime'].map(value3_map)
方法2:merge左连接(适合多字段匹配场景)
如果需要同时从df2匹配多个字段,可以用左连接实现:
# 仅关联需要的列,避免df1和df2同名字段被覆盖 df1 = df1.merge( df2[['datetime', 'value3']], # 可按需添加更多要匹配的列 on='datetime', how='left' )
运行结果
两种方法得到的df1均符合预期:
datetime value1 value2 value3 0 2000-03-10 17:03:00 2 x p 1 2000-03-10 17:03:00 3 y p 2 2000-03-10 17:04:00 4 z d
内容的提问来源于stack exchange,提问作者pandas pandemic
相关产品推荐
相关产品推荐

