如何将DataFrame值按序填充到不同长度Series的NaN且无警告
解决方案
你可以通过向量化赋值的方式实现需求,完全避免循环和警告,同时解决fillna索引对齐的问题,代码如下:
import pandas as pd import numpy as np # 先获取series的独立副本,避免操作切片触发警告 series = series.copy() # 筛选出series中值为NaN的位置 nan_pos = series.isna() # 按顺序将dataframe第0列的值填充到NaN位置,用values取消索引对齐规则 series.loc[nan_pos] = dataframe[0].values
原理说明
- 触发
SettingWithCopyWarning的核心原因是你操作的series大概率是从其他DataFrame中切片得到的视图对象,pandas无法确定你要修改视图还是原始数据,因此抛出警告,提前调用.copy()拿到独立副本即可消除该警告。 - 原生
fillna不满足需求是因为其默认遵循索引对齐规则,只会填充两者索引重叠的位置,且不会按NaN出现的顺序匹配填充值。我们直接提取dataframe[0]的numpy数组(不带索引),再赋值给NaN位置的方式,会完全按顺序填充,符合你的预期。 - 该写法是pandas的标准向量化操作,执行效率远高于手动循环,数据量越大优势越明显。
注意:该写法默认你series中NaN的数量和dataframe第0列的行数完全一致,和你的示例场景匹配。
兼容的循环写法(若有特殊需求必须用循环)
如果一定要保留循环逻辑,只需修改赋值方式即可避免警告:
series = series.copy() j = 0 for i, c in enumerate(series): if np.isnan(c): # 用loc明确指定位置赋值,避免链式索引警告 series.loc[i] = dataframe[0].iloc[j] j += 1
内容的提问来源于stack exchange,提问作者Hajime Fujita
相关产品推荐
相关产品推荐

