Pandas:为DataFrame填充缺失值的最优方法
高效替换DataFrame中指定缺失值的方法
嘿,我来给你分享几个简洁高效的方案,完全不用循环迭代,和R里的简便操作异曲同工!
首先先还原你的场景:
import pandas as pd df = pd.DataFrame([[1,3,'NA',2], [0,1,1,3], [1,2,'NA',1]], columns=['W', 'X', 'Y', 'Z']) print(df)
这个DataFrame里的Y列有两个字符串'NA'作为缺失值,你已经得到了对应的插补值to_impute = [2,1],下面是两种避开循环的最优解法:
方法1:布尔索引直接赋值(最直接高效)
这是最推荐的方式,利用pandas的向量化特性,一行代码就能搞定:
to_impute = [2,1] # 定位Y列等于'NA'的行,直接赋值插补值 df.loc[df['Y'] == 'NA', 'Y'] = to_impute
原理很简单:df['Y'] == 'NA'会生成一个布尔序列,精准标记出需要替换的行;loc索引器可以直接定位这些行的Y列,然后把to_impute列表赋值过去——pandas会自动按顺序将列表中的值对应到目标行,完全不需要手动循环。
方法2:先转换为标准缺失值再填充(适合后续统一处理)
如果之后还需要对其他缺失值做统一操作,可以先把字符串'NA'转换为pandas标准的缺失值pd.NA,再用指定值填充:
# 第一步:将字符串'NA'转为标准缺失值 df['Y'] = df['Y'].replace('NA', pd.NA) # 第二步:针对缺失的行,用to_impute填充 df['Y'] = df['Y'].fillna(pd.Series(to_impute, index=df[df['Y'].isna()].index))
这种方法的好处是统一了缺失值的格式,方便后续用pandas的缺失值处理工具(比如dropna、interpolate等)操作,不过对于当前的需求来说,方法1更直接。
这两种方法都是向量化操作,比循环iloc赋值效率高得多,尤其是当数据量很大的时候,性能差距会非常明显,而且代码简洁易读,完全符合你想要的简洁风格。
内容的提问来源于stack exchange,提问作者fraserbc
相关产品推荐
相关产品推荐

