基于平均值聚类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
相关产品推荐
相关产品推荐

