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

基于食物类别使用中位数填充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。

最终输出结果

运行代码后会得到你预期的结果:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:02:46