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

KNN索引循环构建DataFrame异常:仅生成单行数据求助

问题原因与解决方案

嘿,我一眼就揪出问题所在啦!你的DataFrame最后只保留一行,核心原因是pandas的append()方法不会原地修改原对象——它每次调用都会返回一个包含新增行的新DataFrame,但你没有把这个新结果重新赋值给tab,所以后面的循环迭代完全没起到添加行的作用,最后tab只保留了第一次初始化的那一行。

具体问题拆解

看你的循环代码:

for i in range(0, Cluster):
    if i == 0:
        tab = pd.DataFrame(dataset.iloc[indices[i]])
    else :
        tab.append(dataset.iloc[indices[i]])  # 这里没有把结果赋值回tab!

在else分支里,你调用tab.append(...)后没有把新生成的DataFrame存回tab,相当于白执行了这个操作,原tab一直是第一次创建的那一行数据。

两种修复方案

方案1:修复循环中的赋值问题

只需要把append的结果重新赋值给tab即可:

def NaerestNeighbor_Point(Cluster, dataset, centroide):
    nbrs = NearestNeighbors(n_neighbors=1, algorithm='auto').fit(dataset)
    distances, indices = nbrs.kneighbors(centroide)
    tab = pd.DataFrame([])
    print(indices)
    for i in range(0, Cluster):
        if i == 0:
            tab = pd.DataFrame(dataset.iloc[indices[i]])
        else :
            tab = tab.append(dataset.iloc[indices[i]])  # 新增赋值操作
    print(tab)

方案2:更高效的无循环写法(推荐)

其实完全不需要用循环逐行添加,因为indices是二维数组,我们可以先把它展平成一维数组,然后一次性从原数据集提取所有目标行,这样代码更简洁,效率也更高:

def NaerestNeighbor_Point(Cluster, dataset, centroide):
    nbrs = NearestNeighbors(n_neighbors=1, algorithm='auto').fit(dataset)
    distances, indices = nbrs.kneighbors(centroide)
    # 把二维的indices展平成一维,直接提取所有行
    tab = dataset.iloc[indices.flatten()]
    print(indices)
    print(tab)

你的indices输出是[[ 51] [116] [ 63] [ 89]],indices.flatten()会把它转换成[51, 116, 63, 89],这样dataset.iloc就能一次性取出这四行数据,直接生成包含四行的DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:38:06