基于食物类别使用中位数填充Pandas DataFrame中的缺失值
按类别中位数填充缺失值的解决方案
我来帮你搞定这个缺失值填充的问题,咱们一步步来解决:
首先得注意,你的原始数据里Calorie列的缺失值是字符串'Nan',不是pandas默认识别的数值型缺失值np.nan,这会导致没法直接计算中位数,所以第一步要先把这些字符串转换成真正的缺失值。
完整代码实现
import pandas as pd import numpy as np # 原始数据 data = { "Food": ['apple', 'apple', 'apple','orange','apple','apple','orange','orange','orange'], "Calorie": [50, 40, 50,30,'Nan','Nan',50,30,'Nan'] } # 加载为DataFrame df = pd.DataFrame(data) # 1. 将字符串'Nan'转换为pandas可识别的缺失值np.nan df['Calorie'] = pd.to_numeric(df['Calorie'], errors='coerce') # 2. 按Food分组,用每组的中位数填充该组的缺失值 df['Calorie'] = df.groupby('Food')['Calorie'].transform(lambda x: x.fillna(x.median())) # 输出结果 print(df)
代码细节解释
pd.to_numeric(..., errors='coerce'):把Calorie列强制转换成数值类型,遇到无法转换的'Nan'字符串时,自动替换成np.nan,这样后续才能正常计算中位数。groupby('Food')['Calorie'].transform(...):按Food的类别分组后,对每个组的Calorie列执行填充操作。transform的优势是会返回和原DataFrame长度一致的结果,刚好对应每一行的位置,确保每个缺失值都被对应类别的中位数填充:- apple组的有效热量值是
[50,40,50],中位数为50,所以apple组的两个缺失值会被填充为50; - orange组的有效热量值是
[30,50,30],中位数为30,所以orange组的缺失值会被填充为30。
- apple组的有效热量值是
最终输出结果
运行代码后会得到你预期的结果:
Food Calorie 0 apple 50.0 1 apple 40.0 2 apple 50.0 3 orange 30.0 4 apple 50.0 5 apple 50.0 6 orange 50.0 7 orange 30.0 8 orange 30.0
如果需要把Calorie列转成整数格式,只需再加一行df['Calorie'] = df['Calorie'].astype(int)即可。
内容的提问来源于stack exchange,提问作者Mathew John
相关产品推荐
相关产品推荐

