关于pandas agg()聚合时mean函数触发DataError的技术问询
为啥agg用mean报错,sum却没事?我来给你拆解清楚
嘿,这个问题我之前踩过一模一样的坑!核心原因其实是你的c1和c2列根本不是数值类型,而是字符串(object)类型,这就导致mean没法正常计算,但sum却能“凑活”运行——不过其实sum的结果也不是你想要的数值求和哦!
先搞懂:你的数据类型为啥不对?
看你初始化DataFrame的代码:
df = pd.DataFrame(data=[list(string.ascii_lowercase)[0:5]*2,list(range(1,11)),list(range(11,21))]).T
你把三个列表转置后生成DataFrame,第一个列表是字符串(a、b这些),后面两个是整数列表。但pandas遇到混合类型的列时,会把所有列统一成object类型(也就是字符串类型)。你可以自己跑一遍print(df.dtypes)看看,c1和c2肯定显示的是object,不是int或者float。
为啥sum能跑,mean却报错?
- 关于sum:pandas的
sum对object类型的列,会直接调用元素的加法操作。对字符串来说,加法就是拼接——比如分组a的c1列是'1'和'6',sum之后会得到'16',而不是你以为的7!所以它看起来“正常运行”,但其实结果根本不是数值求和。 - 关于mean:均值计算需要做除法,必须是数值类型才能算。字符串没法参与除法运算,pandas一看这列全是字符串,没有可用于计算均值的数值类型,直接就抛出
DataError了。
怎么解决?
把c1和c2转成数值类型就行,一行代码搞定:
# 转成整数类型,要是有小数就用astype(float) df[['c1', 'c2']] = df[['c1', 'c2']].astype(int)
转完之后再跑分组聚合:
df.groupby('g').agg({ 'c1': ['sum', 'mean'], 'c2': ['sum', 'mean'] })
这下sum会算出正确的数值和,mean也能正常计算均值,再也不会报错啦!
内容的提问来源于stack exchange,提问作者RK1
相关产品推荐
相关产品推荐

