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
相关产品推荐
相关产品推荐

