Pandas不同索引DataFrame列赋值行为及与left merge区别咨询
Pandas 列赋值索引对齐规则解答
核心赋值逻辑
你观察到的赋值效果是Pandas索引对齐机制的原生表现,并不是某类复杂表达式的简写:
给df1新增列时,Pandas会以被赋值的左对象df1的索引为基准,将右侧的df2['XX'] Series 按照索引逐一匹配赋值,匹配失败的位置自动填充NaN,整个赋值过程不会修改df1原有的行索引,所以不会把df2独有的2016-12-31索引加入结果。
和左连接的关系
这个逻辑确实和基于索引的**左连接(left merge)**效果完全一致,等价于下面的完整写法:
df1 = pd.merge(df1, df2[['XX']], left_index=True, right_index=True, how='left').rename(columns={'XX':'BB'})
两种写法输出的结果没有任何区别。
取索引并集的场景
只有当你执行的不是「给现有DataFrame新增列」操作,而是以下两类操作时,Pandas会自动取两个对象的索引并集,缺失位置填充NaN:
- 两个Series/DataFrame做算术运算,比如:
# 输出索引是两个对象的索引并集:2016-12-31、2018-12-31、2019-12-31、2020-12-31 df1['A'] + df2['XX']
- 用
pd.concat按列合并两个对象,比如:
# 输出会保留所有4个日期索引,缺失值填NaN pd.concat([df1, df2], axis=1)
如果你希望给df1赋值时也保留df2的独有行,可以先把df1的索引重设为两者的并集再赋值:
df1 = df1.reindex(df1.index.union(df2.index)) df1['BB'] = df2['XX']
内容的提问来源于stack exchange,提问作者dleal
相关产品推荐
相关产品推荐

