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

如何基于对应Ranking分组的median填充Budget与Profit列的缺失值

原代码问题排查
  • 列名不匹配:数据集分组字段为Ranking,原代码错误使用score作为列名,无法读取对应列数据
  • 方法名拼写错误:缺失值填充方法是fillna,原代码误写为filla
  • 链式索引问题:df.loc[i, :]['budget'].fillna()属于链式索引操作,pandas只会修改返回的副本,不会改动原DataFrame
  • 逻辑不完整:仅处理了Budget列的缺失值,未覆盖Profit列
  • 遍历效率极低:逐行遍历的写法在数据量较大时性能非常差,没有利用pandas向量化操作的特性
优化实现方案

方案1:groupby+transform 简洁实现(推荐)

无需手动写循环,效率最高,代码可维护性强:

import pandas as pd
import numpy as np

# 构造示例数据集
data = {
    'Budget': [10000, np.nan, 5000, 12000, 2000, 5000],
    'Profit': [np.nan, 4000, 7000, np.nan, 4500, 10000],
    'Ranking': [8, 3, 9, 8, 3, 8]
}
df = pd.DataFrame(data)

# 按Ranking分组,用对应分组的中位数填充两列缺失值
df[['Budget', 'Profit']] = df.groupby('Ranking')[['Budget', 'Profit']].transform(
    lambda x: x.fillna(x.median())
)

方案2:基于原循环逻辑修改的版本

如果你需要保留循环写法,修复后的代码如下:

for score in range(1, 11):
    # 计算当前分组两列的中位数
    median_budget = df[df['Ranking'] == score]['Budget'].median()
    median_profit = df[df['Ranking'] == score]['Profit'].median()
    # 取当前分组的所有行索引
    group_idx = df[df['Ranking'] == score].index
    # 直接对原DataFrame对应位置赋值,避免链式索引
    df.loc[group_idx, 'Budget'] = df.loc[group_idx, 'Budget'].fillna(median_budget)
    df.loc[group_idx, 'Profit'] = df.loc[group_idx, 'Profit'].fillna(median_profit)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:06:02