You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于平均值聚类DataFrame相似值时遇TypeError的排查与修复

修复聚类代码中的TypeError问题

嘿,我一眼就看出问题出在哪了!你遇到的TypeError: cannot perform reduce with flexible type错误,根源完全不是Consumption列有字符串,而是你在计算均值的时候传错了参数!

错误原因分析

你写的np.mean(['Consumption'])是在对字符串列表['Consumption']求均值——这显然是南辕北辙!numpy没法对字符串做数值运算,自然会抛出“无法对灵活类型执行归约操作”的错误。你真正需要的是整个DataFrame中Consumption列的数值均值,而不是这个字符串的“均值”。

修复方案一:修改自定义函数

我们先提前计算好全局的Consumption均值,再在聚类函数里用这个预计算的值来判断,代码如下:

import numpy as np
import pandas as pd

# 构造你的数据
data = {
    'Zone': ['North', 'South', 'East', 'North', 'North2', 'South'],
    'Consumption': [1, 3, 10, 8, 0, 5]
}
df = pd.DataFrame(data)

# 预先计算Consumption列的数值均值(这才是正确的方式!)
mean_consumption = df['Consumption'].mean()

def Clustering(row):
    if row['Consumption'] < 0.5 * mean_consumption:
        val = 'E'
    elif row['Consumption'] < 0.75 * mean_consumption:
        val = 'D'
    elif row['Consumption'] < 1 * mean_consumption:
        val = 'C'
    elif row['Consumption'] < 1.5 * mean_consumption:
        val = 'B'
    elif row['Consumption'] < 2.5 * mean_consumption:
        val = 'A'
    else:
        val = 'Z'
    return val

# 给DataFrame添加聚类结果列
df['Cluster'] = df.apply(Clustering, axis=1)

修复方案二:用更高效的pd.cut分箱

其实pandas自带的pd.cut方法更适合这种基于阈值的分箱聚类,不用写自定义函数,代码更简洁高效:

import numpy as np
import pandas as pd

# 构造数据
data = {
    'Zone': ['North', 'South', 'East', 'North', 'North2', 'South'],
    'Consumption': [1, 3, 10, 8, 0, 5]
}
df = pd.DataFrame(data)

mean_consumption = df['Consumption'].mean()

# 定义分箱边界和对应标签
bins = [-np.inf, 0.5*mean_consumption, 0.75*mean_consumption, mean_consumption, 1.5*mean_consumption, 2.5*mean_consumption, np.inf]
labels = ['E', 'D', 'C', 'B', 'A', 'Z']

# 直接生成聚类结果
df['Cluster'] = pd.cut(df['Consumption'], bins=bins, labels=labels)

运行这两种方案都能得到正确的聚类结果,而且不会再报错啦!

内容的提问来源于stack exchange,提问作者Karthik Apadodharanan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:52:59