如何在Pandas中基于日期匹配将另一DataFrame的列添加到目标DataFrame
匹配两个DataFrame并添加指定列的解决方案
针对你描述的需求——把d2的Change列通过d1的Date_with_affect字段与d2的Date索引匹配后添加到d1,这里有两种实用的方法,同时会明确日期不匹配时的处理逻辑:
方法1:使用map()快速映射
这种方法简单直接,适合只需要提取单个列的场景。因为d2的索引是Date,我们可以直接用d1的Date_with_affect去映射d2的Change值:
# 将d2的Change列映射到d1 d1['Change'] = d1['Date_with_affect'].map(d2['Change'])
日期不匹配的处理:
如果d1中某行的Date_with_affect在d2的索引中找不到对应值,该行的Change会被自动填充为NaN(缺失值)。比如如果d1有一行的Date_with_affect是2018-03-07,而d2没有这个日期的索引,那么这行的Change就是NaN。
方法2:使用pd.merge()灵活连接
如果你需要更灵活的匹配规则(比如控制是否保留不匹配的行),可以用pandas的合并函数,它支持多种连接方式:
我们可以直接利用d2的索引作为匹配键,不需要额外转换列:
import pandas as pd # 左连接:保留d1的所有行,匹配不到的Change列填NaN d1_merged = pd.merge( d1, d2[['Change']], # 只选择需要的Change列,减少数据量 left_on='Date_with_affect', right_index=True, how='left' )
不同连接方式的日期不匹配处理:
how='left'(推荐):保留d1的所有行,d2中没有对应日期的行,Change列填充NaN,完全符合你的需求。how='inner':只保留d1和d2中日期完全匹配的行,不匹配的行直接从结果中丢弃。how='outer':保留d1和d2的所有行,双方不匹配的字段都填充NaN。how='right':保留d2的所有行,d1中没有对应日期的行,d1的列会填充NaN(这个场景下一般用不到)。
注意事项:日期格式统一
确保d1的Date_with_affect和d2的索引日期格式一致,否则会出现匹配失败的情况。如果格式不一致,可以先转换为datetime类型:
# 转换d1的日期列 d1['Date_with_affect'] = pd.to_datetime(d1['Date_with_affect']) # 转换d2的索引为datetime d2.index = pd.to_datetime(d2.index)
用上面的方法,你示例中的Id89行的Change列就会成功填充为0.5啦!
内容的提问来源于stack exchange,提问作者Ala Głowacka
相关产品推荐
相关产品推荐

