Pandas groupby分组后计算均值结果不符合预期如何解决
问题原因
结果异常由两个问题共同导致:
- 分组字段不全:你的统计目标是特定区域、特定年份、特定户型的租金均值,但
groupby仅传入了town和quarter,漏掉了flat_type维度,会把同区域同年份所有户型的租金混算,不符合统计需求。 median_rent列类型错误:这是出现e14级别异常值的核心原因。正常2000-3000区间的数值求均值不可能得到万亿级别的结果,说明该列没有被解析为数值类型(int/float),基本是数据读入环节出了问题:要么列里混了千分位逗号、货币符号、空格这类非数字脏字符,要么分隔符识别错误把其他列的长ID、时间戳串到了租金列,pandas做隐式转换时把这些内容转成了超大数值。
修正方法
- 先做数据校验,确认列类型和实际值:
# 打印各列类型,确认median_rent是不是object类型 print(df.dtypes) # 打印租金列的实际存储值,确认是否和你看到的2250/2300一致 print(df['median_rent'].head(20))
- 清洗租金列,转为正确的数值类型:
# 移除租金列里所有非数字、非小数点的字符,再转成浮点型 df['median_rent'] = ( df['median_rent'] .astype(str) .str.replace(r'[^0-9.]', '', regex=True) .astype(float) )
- 补全分组维度后计算均值:
# 按区域、年份、户型三个维度分组求均值 rent_mean = df.groupby(["town", "quarter", "flat_type"])['median_rent'].mean() print(rent_mean)
如果不想看到科学计数法的显示格式,在代码最开头加一行配置即可:
import pandas as pd # 强制浮点数显示两位小数,不用科学计数法 pd.set_option('display.float_format', '{:.2f}'.format)
修正后你提到的2011年CLEMENTI 4-RM户型的计算结果会是预期的2312.5,不会再出现异常值。
内容的提问来源于stack exchange,提问作者bonijad383
相关产品推荐
相关产品推荐

