Pandas 1.4.2中使用.loc方法批量条件赋值问题求助
Pandas 1.4.2中.loc赋值出现NaN的原因及解决方法
问题本质
这不是语法错误,也不属于严格意义上的bug,而是Pandas 1.4.2版本中索引对齐机制在特定赋值场景下的行为特性。
为什么第一种写法会得到NaN?
当你执行:
df.loc[df['C'], ['A', 'B']] = df[['D', 'E']]
Pandas会严格执行索引对齐规则:右侧的df[['D', 'E']]包含DataFrame的所有行索引(示例中是0、1、2),而左侧的df.loc[df['C'], ['A', 'B']]只包含C列为True的行索引(示例中是0、2)。
在Pandas 1.4.2中,这种赋值场景下,Pandas会尝试将右侧完整的DataFrame与左侧的切片做索引匹配,但由于右侧包含左侧不存在的索引(比如示例中的1),导致赋值逻辑出现异常,最终使得目标位置(索引0、2)的A、B列被赋值为NaN。
为什么元组写法可行?
你使用的可行写法:
df.loc[df['C'], ['A', 'B']] = (df.D[df.C], df.E[df.C])
本质是将两个已被筛选的Series作为赋值源:df.D[df.C]和df.E[df.C]只保留了C列为True的行,它们的索引与左侧切片的索引完全一致(都是0、2)。此时Pandas不需要做复杂的索引对齐,直接按索引匹配赋值,因此能得到正确结果。
更规范的替代写法
推荐直接在右侧也使用.loc筛选对应行,确保两边索引完全匹配,代码更清晰且不易出错:
df.loc[df['C'], ['A', 'B']] = df.loc[df['C'], ['D', 'E']]
版本说明
后续Pandas版本(如1.5.x及以上)对这类赋值场景的索引对齐逻辑做了优化,直接使用df.loc[df['C'], ['A', 'B']] = df[['D', 'E']]也能得到正确结果,但在1.4.2版本中必须保证赋值源与目标的索引一致。
内容的提问来源于stack exchange,提问作者Eliy Arlev
相关产品推荐
相关产品推荐

