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
相关产品推荐
相关产品推荐

