Python中df.groupby.sum()返回NaN问题求助
解决DataFrame分组求和后出现NaN的问题
可能的原因及对应解决方案
1. 分组键Temperature存在隐形格式差异
看起来相同的温度值,实际可能是不同数据类型(如25和25.0)、带空格/不可见字符的字符串,或是浮点精度差异(如25.0000001和25.0),导致分组后生成了独立的组,进而出现求和结果为NaN的情况。
解决方法:
- 统一数据类型:
# 转换为数值类型,若有无法转换的项会报错(确保原数据无非法值) df['Temperature'] = pd.to_numeric(df['Temperature'], errors='raise') - 处理浮点精度:
# 根据实际精度需求保留小数位,消除微小差异 df['Temperature'] = df['Temperature'].round(2) - 清理字符串型温度值:
# 去除首尾空格和不可见字符 df['Temperature'] = df['Temperature'].str.strip()
2. time_spent列非数值类型
如果time_spent是字符串格式(比如带"小时"单位,或存储为字符串数字),即使没有NaN,sum()操作也无法正确计算数值,会返回NaN。
解决方法:
- 清理并转换为数值类型:
# 若列中包含单位,先移除单位再转换 df['time_spent'] = df['time_spent'].str.replace('小时', '').astype(float) # 直接转换字符串数字为数值(报错模式确保无非法值) df['time_spent'] = pd.to_numeric(df['time_spent'], errors='raise')
3. 分组时未指定目标列
直接使用groupby().sum()会对所有数值列求和,若Temperature是数值型,可能干扰结果显示。建议明确指定求和的列,避免歧义。
优化后的分组代码:
# 仅对time_spent列求和,结果更清晰 df_copy = df.groupby('Temperature', as_index=False)['time_spent'].sum()
快速排查步骤
检查列数据类型:
print(df.dtypes)若
Temperature或time_spent为object类型,优先处理类型转换。查看
Temperature的唯一值是否异常:print(df['Temperature'].unique())观察是否有明显格式不一致的数值或字符串。
内容的提问来源于stack exchange,提问作者Gowtham Balaji
相关产品推荐
相关产品推荐

