Pandas pivot_table报'No numeric types to aggregate'错误如何解决
问题原因
No numeric types to aggregate报错来自pd.pivot_table执行步骤,触发原因有两个:
- 你指定的
values参数对应的is_commodity列不是数值类型,可能为字符串、布尔值或者object类型,pandas透视表默认的mean聚合函数无法对非数值类型生效 - 你的数据中同一个
['family','SF_type'] + ['SIC']的组合存在重复值,默认聚合逻辑无法处理非数值列
解决步骤
1. 转换is_commodity为数值类型
先执行以下代码确认并转换字段类型:
# 先查看当前字段类型 print(merge_3f['is_commodity'].dtype) # 强制转换为int类型,支持布尔值、字符串格式的数字转换 merge_3f['is_commodity'] = pd.to_numeric(merge_3f['is_commodity'], errors='coerce') # 清除转换后生成的空值 merge_3f = merge_3f.dropna(subset=['is_commodity'])
2. 修改透视表逻辑
如果你不需要对值做聚合计算,只是要生成行列对应的0/1矩阵,推荐两种适配方案:
- 方案1:给pivot_table明确指定聚合函数
pivot_ind=pd.pivot_table( merge_3f, index=['family','SF_type'], values='is_commodity', columns=['SIC'], aggfunc='first' # 明确指定取每个分组的第一个值,替换默认的mean聚合 )
- 方案2:直接用
pd.crosstab生成0/1矩阵,更适配当前场景
pivot_ind = pd.crosstab( index=[merge_3f['family'], merge_3f['SF_type']], columns=merge_3f['SIC'], values=merge_3f['is_commodity'], aggfunc='first' )
3. 热力图效果优化(可选)
如果要更贴合你预期的1值高亮效果,可以自定义配色:
# 自定义配色:0为白色,1为深绿 colormap = ['#FFFFFF', '#228B22'] # 热力图参数增加vmin、vmax保证颜色映射正确 sns.heatmap( pivot_ind.query('SF_type=="SMB"'), annot=False, linewidths=0.5, cmap=colormap, cbar=False, ax=ax1, vmin=0, vmax=1 ) # 第二个CORP分类的热力图同理增加vmin、vmax参数即可
内容的提问来源于stack exchange,提问作者Stefano Puccini
相关产品推荐
相关产品推荐

