如何按索引匹配将pandas小DataFrame的值填充到大DataFrame
错误写法原因
- 第一种写法问题:
df1.index.date和df2.index.date是长度不等的日期数组,直接用==做元素级对比时长度不匹配,才触发弃用告警;另外代码里写的df2.value2 == df1.value1是比较运算不是赋值运算,就算判断逻辑成立也不会修改列值。 - 第二种写法问题:给DataFrame列赋值时传入的列表只有1个元素,和df2的索引长度不匹配,直接触发长度报错;且列表内的判断逻辑没有逐行做日期匹配,本身逻辑不成立。
- 用
iterrows()逐行遍历属于低效操作,pandas的向量化接口可以直接实现需求,不需要写循环。
正确实现代码
首先先确认两个DataFrame的索引为datetime类型,不是的话先做转换:
import pandas as pd df1.index = pd.to_datetime(df1.index) df2.index = pd.to_datetime(df2.index)
直接通过日期映射完成赋值,全程向量化操作,性能远高于逐行遍历:
# 将df2索引的时分秒归零,对齐df1的日期粒度后做值映射 df2['value2'] = df2.index.normalize().map(df1['value1'])
如果df1的索引是原生Python date类型而非pandas datetime类型,可以用提取日期的方式对齐:
date_map = pd.Series(df1['value1'].values, index=df1.index.date) df2['value2'] = [date_map[d] for d in df2.index.date]
补充说明
如果df2中存在df1未覆盖的日期,上述代码会将对应行的value2填充为NaN。如果需要保留这部分行原有的value2值,可以改用combine_first做对齐填充:
date_aligned_s = df2.index.normalize().map(df1['value1']) df2['value2'] = date_aligned_s.combine_first(df2['value2'])
执行后即可得到预期结果,所有同日期的行都会填充为df1中对应日期的value1值。
内容的提问来源于stack exchange,提问作者m_abbott
相关产品推荐
相关产品推荐

