多数据集拼接后执行K-Means聚类报AttributeError问题求助
电容温度实验KMeans聚类报错排查
问题说明
- 现有5份多字段的不同类型电容温度实验数据,计划对拼接后的全量数据集执行K-Means聚类分析
- 完成所有数据集拼接后运行代码,持续触发报错:
AttributeError: 'NoneType' object has no attribute 'split'
相关资源
- 实验数据集:电容温度实验数据
- 运行截图:报错截图1、报错截图2、报错截图3
- 原始代码:Python分析代码
原始复现代码
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
相关产品推荐
相关产品推荐

