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

Pandas DataFrame新增列异常:bb列值全为0的问题排查与解决

Pandas中transform创建差值列全为0的问题分析与解决

嘿,我来帮你捋清楚这个问题!你说aa列(城市平均温度)结果正常,但bb列本该是「城市温度减去所有城市平均温度」却全为0,咱们一步步拆解原因和解决办法:

先搞清楚两个核心问题

1. 代码逻辑和你的需求不匹配

你描述的bb列需求是「城市温度 - 所有城市的整体平均温度」,但你写的代码用了groupby(['City'])的transform,这实际上计算的是每个温度减去所在城市的平均温度,和你想要的“所有城市平均”完全不是一回事。

2. 结果全为0的直接原因

如果你的代码确实是按组内平均计算,但结果全为0,大概率是你的DataFrame里每个城市只有一条记录!因为分组后每个组的平均温度就是这条记录本身的温度值,用自身减去自身,结果自然全是0。你可以用这条代码验证一下每个城市的记录数:

print(file.groupby('City').size())

针对两种需求的解决方案

需求A:我就是要「城市温度 - 所在城市的平均温度」

如果这才是你的真实需求,那你的lambda用法本身是没问题的!但要确保每个城市有多条温度记录。另外可以把代码写得更简洁:

# 写法1:用lambda
file["bb"] = file.groupby(['City'])["Temperature"].transform(lambda x: x - np.mean(x))
# 写法2:更直观,不用lambda
file["bb"] = file["Temperature"] - file.groupby(['City'])["Temperature"].transform('mean')

要是每个城市只有一条记录,那全0是正常现象,毕竟没有其他数据来计算偏差~

需求B:我要的是「城市温度 - 所有城市的整体平均温度」

这就不需要用groupby啦,直接计算整个温度列的平均值,再做减法就行:

# 先算出所有城市的整体平均温度
all_city_avg = file["Temperature"].mean()
# 创建bb列
file["bb"] = file["Temperature"] - all_city_avg

最后再确认下lambda的使用

你的lambda写法本身是正确的,只要是针对分组后的Series做计算,lambda x: x - np.mean(x)能正确得到组内每个值和组均值的差值,问题主要出在需求和代码逻辑的匹配上,以及可能的单条记录分组的情况~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:19:44