Python中聚类中心更新代码里centroids与t_sent同步变化的问题排查
问题原因与解决方案
哦,这个坑我踩过好多次!你遇到的是Python里对象引用机制导致的典型问题:当你执行t_sent = centroids时,并没有创建一个全新的DataFrame副本,而是让t_sent和centroids指向了内存中同一个对象。换句话说,它们俩是“同一个东西的两个名字”——所以你后续在嵌套循环里修改t_sent的内容,本质上就是直接修改了原始的centroids对象,自然会看到它跟着变化。
具体到你的代码
你的循环里,t_sent.iloc[m, n] = ...这行代码是在直接修改t_sent指向的DataFrame内容,而因为t_sent和centroids共享同一个对象,centroids的内容也会同步被修改,哪怕你后面写了centroids = t_sent,这一步其实没有任何意义(因为它们本来就是同一个对象)。
怎么解决?
只需要把引用赋值改成创建副本就行,pandas的DataFrame提供了.copy()方法来生成独立的新对象:
修改这一行:
t_sent = centroids.copy()
这样t_sent就变成了一个完全独立的DataFrame,后续对它的修改不会影响原始的centroids,完美解决你的问题。
修改后的完整代码
import numpy as np import pandas as pd def Calc_New_cent(centroids, Data): while True: # 创建DataFrame的独立副本,避免引用共享 t_sent = centroids.copy() for m in range(k): for n in range(number_of_features): t_sent.iloc[m, n] = np.mean(Data[Data['clusters'] == m + 1]['{}'.format(n + 1)]) # 简化判断写法,更符合Python风格 if not t_sent.isnull().values.any(): centroids = t_sent break return centroids
额外小提示
如果你的DataFrame包含嵌套的复杂对象(比如单元格里存着列表、字典),可以用deep=True明确指定深拷贝:
t_sent = centroids.copy(deep=True)
不过对于你的场景来说,默认的.copy()(深拷贝)已经足够啦。
内容的提问来源于stack exchange,提问作者ضرغام كاظم
相关产品推荐
相关产品推荐

