groupby后调用mean报错No numeric types to aggregate的问题排查
问题根源:
data1列的数据类型错误 你遇到的DataError: No numeric types to aggregate错误,核心原因是第二个DataFrame的data1列是object类型(非数值型),而pandas的mean()聚合函数只能处理数值类型数据。
为什么会出现这个差异?
我们来对比两种DataFrame的构造方式:
第一个成功的例子:
你直接传入data1: 1+0.1*numpy.arange(1,6),pandas会自动识别这是一个numpy浮点数组,将data1列设置为float64类型(可以用df.dtypes查看验证)。第二个出错的例子:
你先把日期数组和数值数组合并成了一个numpy数组:datedat = numpy.array([date_range_1(datetime.datetime(2015, 1, 17),5),1+0.1*numpy.arange(1,6)]).T由于这个数组同时包含
datetime对象和浮点数值,numpy会将整个数组的 dtype 设为object(通用对象类型)。当你取datedat[:,1]作为data1列传入DataFrame时,这些数值依然以object类型存储,而非浮点型——这就导致聚合时找不到可计算的数值类型。
解决方法
这里有两种简单的修复方式:
方法1:避免构造numpy object数组,直接分列传入DataFrame
跳过合并numpy数组的步骤,像第一个例子那样直接传入各列数据,确保data1是数值类型:
dates = date_range_1(datetime.datetime(2015, 1, 17),5) data = 1+0.1*numpy.arange(1,6) years = [day.year for day in dates] months = [day.month for day in dates] datedatF = pandas.DataFrame({ 'key1': dates, 'key2': numpy.array(years)*1000 + numpy.array(months), 'data1': data })
方法2:将data1列转换为数值类型
如果要保留当前的构造流程,只需在groupby前把data1列转为浮点型:
# 转换data1为数值类型 datedatF['data1'] = pandas.to_numeric(datedatF['data1']) # 再执行groupby和聚合 grouped2 = datedatF['data1'].groupby(datedatF['key2']) print(grouped2.mean())
额外优化:简化key2的生成
你可以利用pandas的datetime属性直接生成年份+月份的key,代码更简洁且不易出错:
datedatF['key2'] = datedatF['key1'].dt.year * 1000 + datedatF['key1'].dt.month
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

