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

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,提问作者ضرغام كاظم

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:42:45