Pandas中fillna用Series填充DataFrame缺失值的行为疑问解析
pandas中fillna按列填充缺失值的行为问题
我尝试用DataFrame的第1列填充第0列和第2列的缺失值,但执行代码后结果不符合预期,下面具体说明:
原始DataFrame
0 1 2 0 NaN 0.076733 0.378676 1 NaN 0.223911 NaN 2 NaN 0.173071 0.534397 3 NaN 0.991686 0.381196 4 0.088309 0.237683 0.003508 5 0.751860 0.494204 0.757413 6 0.630420 0.192947 0.538492
执行代码
df.fillna(df[1])
实际输出
0 1 2 0 0.076733 0.076733 0.378676 1 0.076733 0.223911 0.173071 2 0.076733 0.173071 0.534397 3 0.076733 0.991686 0.381196 4 0.088309 0.237683 0.003508 5 0.751860 0.494204 0.757413 6 0.630420 0.192947 0.538492
预期输出
0 1 2 0 0.076733 0.076733 0.378676 1 0.223911 0.223911 0.223911 2 0.173071 0.173071 0.534397 3 0.991686 0.991686 0.381196 4 0.088309 0.237683 0.003508 5 0.751860 0.494204 0.757413 6 0.630420 0.192947 0.538492
原因解析
df.fillna()默认按**列方向(axis=0)**处理填充值:
- 当传入Series作为
value参数时,pandas会将Series的索引与DataFrame的列名匹配,用对应列名的值填充该列的缺失值。 - 你的
df[1]是行索引为0-6的Series,而DataFrame列名是0、1、2,两者索引完全不匹配,导致pandas无法正确按列映射,最终出现不符合预期的填充结果。
你想要的是按行填充——用每行的第1列值填充该行的缺失值,这需要调整对齐方向。
正确实现方式
方式1:字典映射(你发现的写法)
df.fillna({0: df[1], 2: df[1]})
明确指定每一列的填充值为第1列的Series,pandas会按行索引对齐填充。
方式2:指定axis=1(更简洁)
df.fillna(df[1], axis=1)
axis=1设置按行方向对齐,pandas会用每行的第1列值填充该行的所有缺失值,直接得到预期结果。
内容的提问来源于stack exchange,提问作者Rajib Lochan Sarkar
相关产品推荐
相关产品推荐

