如何用对应列表值填充DataFrame各列的NaN值?
解决DataFrame按列位置用指定值填充NaN及消除SettingWithCopyWarning问题
问题分析
你当前的代码存在两个核心问题:
- 第一个循环逻辑错误:嵌套列循环会让每一列被所有填充值重复覆盖,无法实现「对应列用对应位置值填充」的需求;
SettingWithCopyWarning警告:说明ts_wet是从其他DataFrame切片得到的副本,而非原数据的引用,pandas无法确定你是否要修改原数据,因此抛出警告。
解决方案
步骤1:消除SettingWithCopyWarning
先将ts_wet转换为独立的DataFrame副本,避免修改切片时的警告:
ts_wet = ts_wet.copy()
步骤2:按列位置对应填充NaN
提供两种可靠实现方式:
方式一:按列索引循环填充
直接遍历列的索引位置,将列表中对应位置的值填充到对应列的NaN:
# 遍历每个列的索引 for col_idx in range(len(ts_wet.columns)): # 获取当前列名和对应的填充值 current_col = ts_wet.columns[col_idx] fill_val = averages_wet[col_idx] # 填充NaN(不用inplace,直接赋值更安全) ts_wet[current_col] = ts_wet[current_col].fillna(fill_val)
方式二:用字典映射批量填充(更简洁)
通过zip将列名和填充值配对成字典,传给fillna的value参数实现批量填充:
# 创建列名与填充值的映射字典 fill_mapping = dict(zip(ts_wet.columns, averages_wet)) # 批量填充NaN ts_wet = ts_wet.fillna(value=fill_mapping)
为什么你的原代码失败
- 第一个循环中,你错误地使用了未定义的
cols变量(应为col),且嵌套的列循环会导致每一列被所有填充值重复处理,完全偏离了「对应列对应值」的逻辑; - 直接调用
ts_wet.CalamarQ.fillna(..., inplace=True)时,因为ts_wet是切片副本,pandas无法确认修改操作的对象,因此抛出警告,用copy()创建独立副本即可解决。
内容的提问来源于stack exchange,提问作者Amy Zammit
相关产品推荐
相关产品推荐

