如何基于对应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
相关产品推荐
相关产品推荐

