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

多数据集拼接后执行K-Means聚类报AttributeError问题求助

电容温度实验KMeans聚类报错排查

问题说明

  • 现有5份多字段的不同类型电容温度实验数据,计划对拼接后的全量数据集执行K-Means聚类分析
  • 完成所有数据集拼接后运行代码,持续触发报错:AttributeError: 'NoneType' object has no attribute 'split'

相关资源

原始复现代码

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import plotly.express as px

# 读取温度实验数据
Cap_80=pd.read_csv(r"C:\Users\User\Documents\CapacitorEXP\Temp_Cap_2200\data0203_200uf_80deg.csv",encoding='unicode_escape')

Cap_90=pd.read_csv(r"C:\Users\User\Documents\CapacitorEXP\Temp_Cap_2200\data0303_2200uf_90deg.csv",encoding='unicode_escape')

Cap_100=pd.read_csv(r"C:\Users\User\Documents\CapacitorEXP\Temp_Cap_2200\data0803_200uf_110deg.csv",encoding='unicode_escape')

Cap_110=pd.read_csv(r"C:\Users\User\Documents\CapacitorEXP\Temp_Cap_2200\data0803_2200uf_110deg.csv",encoding='unicode_escape')

Cap_120=pd.read_csv(r"C:UsersUserDocumentsCapacitorEXPTemp_Cap_2200data1803_2200uf_120deg.csv",cap_120encoding='unicode_escape')


# 提取每份数据集的目标列
df1 = pd.DataFrame(Cap_80.iloc[:,5:9].reset_index(drop=True))
                   
df2 = pd.DataFrame(Cap_90.iloc[:,5:9].reset_index(drop=True))

df3 = pd.DataFrame(Cap_100.iloc[:,5:9].reset_index(drop=True))

df4 = pd.DataFrame(Cap_110.iloc[:,5:9].reset_index(drop=True))
                   
df5 = pd.DataFrame(Cap_120.iloc[:,5:9].reset_index(drop=True))

# 合并所有数据集
df = (df1, df2, df3, df4, df5)
data = pd.concat(df)

# 用肘部法则确定最优k值
wcss=[]
for i in range(1,7):
kmeans = KMeans(i)
kmeans.fit(data)
wcss_iter = kmeans.inertia_
wcss.append(wcss_iter)

number_clusters = range(1,7)
plt.plot(number_clusters,wcss)
plt.title('The Elbow title')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')

k_means_optimum = KMeans(n_clusters = 2, init = 'k-means++',  random_state=42)
y = k_means_optimum.fit_predict(data)
print(y)

完整报错栈

AttributeError                            Traceback (most recent call last)
<ipython-input-14-d1d8a96c4bce> in <module>
      1 k_means_optimum = KMeans(n_clusters = 3, init = 'k-means++',  random_state=42)
----> 2 y = k_means_optimum.fit_predict(data)
      3 print(y)

~\anaconda3\lib\site-packages\sklearn\cluster\_kmeans.py in fit_predict(self, X, y, sample_weight)
   1097             Index of the cluster each sample belongs to.
   1098         """
-> 1099         return self.fit(X, sample_weight=sample_weight).labels_
   1100 
   1101     def fit_transform(self, X, y=None, sample_weight=None):

~\anaconda3\lib\site-packages\sklearn\cluster\_kmeans.py in fit(self, X, y, sample_weight)
   1043         for seed in seeds:
   1044             # run a k-means once
-> 1045             labels, inertia, centers, n_iter_ = kmeans_single(
   1046                 X, sample_weight, self.n_clusters, max_iter=self.max_iter,
   1047                 init=init, verbose=self.verbose, tol=tol,

~\anaconda3\lib\site-packages\sklearn\cluster\_kmeans.py in _kmeans_single_elkan(X, sample_weight, n_clusters, max_iter, init, verbose, x_squared_norms, random_state, tol, n_threads)
    432 
    433     for i in range(max_iter):
--> 434         elkan_iter(X, sample_weight, centers, centers_new, weight_in_clusters,
    435                    center_half_distances, distance_next_center, upper_bounds,
    436                    lower_bounds, labels, center_shift, n_threads)

sklearn\cluster\_k_means_elkan.pyx in sklearn.cluster._k_means_elkan.elkan_iter_chunked_dense()

~\anaconda3\lib\site-packages\threadpoolctl.py in __init__(self, limits, user_api)
    169             self._check_params(limits, user_api)
    170 
--> 171         self._original_info = self._set_threadpool_limits()
    172 
    173     def __enter__(self):

~\anaconda3\lib\site-packages\threadpoolctl.py in _set_threadpool_limits(self)
    266             return None
    267 
--> 268         modules = _ThreadpoolInfo(prefixes=self._prefixes,
    269                                   user_api=self._user_api)
    270         for module in modules:

~\anaconda3\lib\site-packages\threadpoolctl.py in __init__(self, user_api, prefixes, modules)
    338 
    339             self.modules = []
--> 340             self._load_modules()
    341             self._warn_if_incompatible_openmp()
    342         else:

~\anaconda3\lib\site-packages\threadpoolctl.py in _load_modules(self)
    371             self._find_modules_with_dyld()
    372         elif sys.platform == "win32":
--> 373             self._find_modules_with_enum_process_module_ex()
    374         else:
    375             self._find_modules_with_dl_iterate_phdr()

~\anaconda3\lib\site-packages\threadpoolctl.py in _find_modules_with_enum_process_module_ex(self)
    483 
    484                 # Store the module if it is supported and selected
--> 485                 self._make_module_from_path(filepath)
    486         finally:
    487             kernel_32.CloseHandle(h_process)

~\anaconda3\lib\site-packages\threadpoolctl.py in _make_module_from_path(self, filepath)
    513             if prefix in self.prefixes or user_api in self.user_api:
    514                 module_class = globals()[module_class]
--> 515                 module = module_class(filepath, prefix, user_api, internal_api)
    516                 self.modules.append(module)
    517 

~\anaconda3\lib\site-packages\threadpoolctl.py in __init__(self, filepath, prefix, user_api, internal_api)
    604         self.internal_api = internal_api
    605         self._dynlib = ctypes.CDLL(filepath, mode=_RTLD_NOLOAD)
--> 606         self.version = self.get_version()
    607         self.num_threads = self.get_num_threads()
    608         self._get_extra_info()

~\anaconda3\lib\site-packages\threadpoolctl.py in get_version(self)
    644                              lambda: None)
    645         get_config.restype = ctypes.c_char_p
--> 646         config = get_config().split()
    647         if config[0] == b"OpenBLAS":
    648             return config[1].decode("utf-8")

AttributeError: 'NoneType' object has no attribute 'split'

错误修复步骤

1. 先修复代码本身的语法与逻辑错误

  • 修复Cap_120文件读取错误:原代码路径丢失反斜杠,且参数名错误多写了cap_120前缀,修正为:
Cap_120=pd.read_csv(r"C:\Users\User\Documents\CapacitorEXP\Temp_Cap_2200\data1803_2200uf_120deg.csv",encoding='unicode_escape')
  • 修复肘部法则循环缩进错误:for循环下的代码需统一缩进4空格,否则循环逻辑不生效:
for i in range(1,7):
    kmeans = KMeans(i)
    kmeans.fit(data)
    wcss_iter = kmeans.inertia_
    wcss.append(wcss_iter)
  • 新增数据清洗逻辑:KMeans不支持非数值、空值输入,拼接完数据后需先做清洗:
data = pd.concat(df).reset_index(drop=True)
# 删除空值,统一转为浮点型
data = data.dropna().astype(float)

2. 修复split属性报错

该报错是Anaconda Windows环境下常见的依赖兼容问题,由threadpoolctl库与OpenBLAS版本不匹配导致,按优先级选以下一种方案即可:

  • 方案1(优先尝试):在所有import语句最开头添加环境变量配置,绕过线程池版本检测:
import os
os.environ["OPENBLAS_NUM_THREADS"] = "1"
  • 方案2:如果方案1无效,在Anaconda终端执行命令升级不兼容依赖,升级完成后重启Python内核再运行:
pip install --upgrade threadpoolctl numpy scikit-learn

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:57:23