You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用众数填充DataFrame列空值的循环失效,求解决方案

问题

有如下pandas DataFrame样本:

import pandas as pd
import numpy as np

d=['SKODASUPERB','SKODASUPERB',
   'SKODASUPERB','MERCEDES-BENZE CLASS','ASTON MARTINVIRAGE'
       ,'ASTON MARTINVIRAGE','ASTON MARTINVIRAGE','TOYOTAHIACE',
           'TOYOTAAVENSIS','TOYOTAAVENSIS','TOYOTAAVENSIS','TOYOTAAVENSIS',
               'FERRARI360','FERRARILAFERRARI']
x=['SUV','SUV','nan','nan','SPORTS','SPORTS','SPORTS',
   'nan','SEDAN','SEDAN','SEDAN','SEDAN','SPORT','SPORT'] 

df=pd.DataFrame({'make_model':d,'body':x})
df.body=df.body.replace('nan',np.NaN)
df.head()

输出结果:

make_model    body
0           SKODASUPERB     SUV
1           SKODASUPERB     SUV
2           SKODASUPERB     NaN
3  MERCEDES-BENZE CLASS     NaN
4    ASTON MARTINVIRAGE  SPORTS

body列存在3个空值:

df.body.isnull().sum()
# Out[25]: 3

希望按make_model分组,用每组body的众数填充组内空值(比如SKODASUPERB组众数是SUV,填充该组空值),编写了如下循环代码:

make_model_list=df.make_model.unique().tolist()

for x in make_model_list:
    df.loc[(df['make_model']==x)&(df['body'].isnull()),'body']=\
        df.loc[(df['make_model']==x)&(df['body'].isnull()),'body']\
            .fillna(df.loc[df['make_model']==x,'body'].mode())

但循环失效,空值仍未填充(仍有3个空值),原因是部分make_model组没有可用众数(比如MERCEDES-BENZE CLASS组全为空值)。想使用continue语句让循环继续执行,请问如何修改代码使循环正常运行?


解决方案

1. 修复循环代码(加入continue逻辑)

原代码失效的核心原因是:当某组body全为空时,mode()会返回空Series,用它填充空值不会生效,还会中断该次循环的填充逻辑。我们可以先计算每组的众数,判断是否有效,无效则直接跳过该组:

make_model_list = df.make_model.unique().tolist()

for x in make_model_list:
    # 提取当前组的body列
    group_body = df.loc[df['make_model'] == x, 'body']
    # 计算组内众数,返回结果是Series
    mode_val = group_body.mode()
    # 如果众数为空(组内全是NaN),直接跳过该组
    if mode_val.empty:
        continue
    # 用众数的第一个值填充当前组的空值
    df.loc[(df['make_model'] == x) & (df['body'].isnull()), 'body'] = mode_val.iloc[0]

执行后,SKODASUPERB组的空值会被填充为SUV,MERCEDES-BENZE CLASS和TOYOTAHIACE组的空值因为无有效众数会保留NaN,此时空值数量变为2,符合预期。

2. 更简洁的pandas分组填充写法

不需要手动写循环,用groupby结合transform可以更高效实现需求,自动跳过无众数的组:

# 定义填充函数:返回组的众数,无众数则返回NaN
def fill_mode(group):
    mode_val = group.mode()
    return mode_val.iloc[0] if not mode_val.empty else np.nan

# 分组填充空值
df['body'] = df.groupby('make_model')['body'].transform(lambda x: x.fillna(fill_mode(x)))

这种写法符合pandas向量化操作的风格,代码更简洁易维护。

内容的提问来源于stack exchange,提问作者saad1s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:35:17