如何创建以Pandas DataFrame为参数的非循环空值填充函数?
用Pandas替换DataFrame列空值为众数(无循环实现)
直接上可运行的函数实现,完全不需要循环,利用Pandas内置方法完成需求:
import pandas as pd def fill_null_with_mode(df): # 创建输入DataFrame的副本,避免修改原数据 df_copy = df.copy() # 计算每列的众数,取第一个众数值(处理一列存在多个众数的情况) column_modes = df_copy.mode().iloc[0] # 按列匹配众数并填充空值 df_copy.fillna(column_modes, inplace=True) return df_copy
关键步骤说明
- 副本创建:
df.copy()保证函数操作的是独立副本,不会对传入的原始DataFrame产生副作用,严格符合返回副本的要求。 - 众数计算:
mode()方法会返回每列的所有众数(若某列有多个值出现频率相同),返回结果是一个DataFrame;iloc[0]提取第一行,得到以原DataFrame列名为索引、对应列众数为值的Series。 - 空值填充:
fillna()方法支持传入Series参数,会自动根据索引匹配到对应列,批量填充该列的所有空值,全程依赖Pandas的向量化操作,无需手动循环。
示例验证
# 构造测试数据 test_df = pd.DataFrame({ 'NumCol': [3, 1, 1, None, 2, 1], 'StrCol': ['apple', 'banana', 'apple', None, 'banana', 'banana'], 'FloatCol': [None, 2.5, 2.5, 3.0, None, 2.5] }) # 调用函数填充空值 filled_df = fill_null_with_mode(test_df) print(filled_df)
输出结果:
NumCol StrCol FloatCol 0 3.0 apple 2.5 1 1.0 banana 2.5 2 1.0 apple 2.5 3 1.0 banana 3.0 4 2.0 banana 2.5 5 1.0 banana 2.5
可以看到:
- NumCol的众数是1,填充了第3行的空值
- StrCol的众数是banana(出现3次),填充了第3行的空值
- FloatCol的众数是2.5,填充了第0和第4行的空值
内容的提问来源于stack exchange,提问作者Pipo
相关产品推荐
相关产品推荐

