如何基于DataFrame中其他有效值填充含NaN的列?附代码片段
解决DataFrame列内NaN填充问题
嘿,我来帮你搞定这个DataFrame填充NaN的问题!首先先理清楚你的需求:你想用col1、col2、col3这三列里的有效值,填充这三列中的NaN值。先把你的原始数据整理成清晰的表格:
| col1 | col2 | col3 | col4 |
|---|---|---|---|
| nan | 1 | 2 | 4 |
| 2 | 2 | 2 | 3 |
| 3 | nan | 1 | 2 |
改进你的现有循环代码
你的初始思路是对的,但有几个小细节需要修正:比如列表推导式里的变量名重复、判断NaN的方式不够严谨,还有循环变量不匹配的问题。我帮你修正并完善了代码,直接可以运行:
import pandas as pd import numpy as np # 先构造你的目标DataFrame df = pd.DataFrame({ 'col1': [np.nan, 2, 3], 'col2': [1, 2, np.nan], 'col3': [2, 2, 1], 'col4': [4, 3, 2] }) # 遍历每一行,处理NaN填充 for idx, row in df.iterrows(): # 提取当前行需要处理的三列 target_cols = row[['col1', 'col2', 'col3']] # 获取该行的有效值(过滤掉NaN) valid_vals = target_cols.dropna().values # 如果有有效值,就用均值填充NaN(你也可以换成第一个有效值、众数等) if len(valid_vals) > 0: fill_val = valid_vals.mean() # 替换成valid_vals[0]可取第一个有效值 df.loc[idx, ['col1', 'col2', 'col3']] = target_cols.fillna(fill_val) # 输出结果 print(df)
运行后得到的结果:
col1 col2 col3 col4 0 1.5 1.0 2.0 4 1 2.0 2.0 2.0 3 2 3.0 2.0 1.0 2
更高效的Pandas内置方法
如果你的数据集比较大,循环的效率会很低,推荐用Pandas的内置方法,一行代码就能完成需求,性能提升很多:
# 用每行的有效值均值填充NaN df[['col1', 'col2', 'col3']] = df[['col1', 'col2', 'col3']].apply( lambda x: x.fillna(x.mean()), axis=1 ) # 如果你想取第一个有效值填充(而不是均值),可以用这段代码: # df[['col1', 'col2', 'col3']] = df[['col1', 'col2', 'col3']].apply( # lambda x: x.fillna(x.dropna().iloc[0] if not x.dropna().empty else np.nan), axis=1 # )
代码解释
axis=1指定逐行处理,而不是默认的逐列x.mean()计算当前行三列的有效值均值,用来填充该行的NaN- 如果某一行三个值全是NaN(你的数据里没有这种情况),可以保留NaN或者自定义填充值
内容的提问来源于stack exchange,提问作者Piyush S. Wanare
相关产品推荐
相关产品推荐

