For循环仅返回最后一项

Posted

技术标签:

【中文标题】For循环仅返回最后一项【英文标题】:For loop only returning last item 【发布时间】:2021-08-14 01:24:27 【问题描述】:
# Create random df
df = pd.DataFrame(np.random.randint(1,10, size=(100,23)))
test = df[:50]  

for i in range(len(test)):
    query_node = test.iloc[i]
    # Find the distance between this node and everyone else
    euclidean_distances = test.apply(lambda row: distance.euclidean(row, query_node), axis=1)
    # Create a new dataframe with distances.
    distance_frame = pd.DataFrame(data="dist": euclidean_distances, "idx": euclidean_distances.index)
    distance_frame.sort_values("dist", inplace=True)
    smallest_dist = [dist["idx"] for idx, dist in distance_frame.iloc[1:4].iterrows()]

我被这个问题难住了,想知道是否有人能看出我哪里出错了。我正在尝试计算每行与每行之间的欧几里得距离。然后,我对这些距离进行排序,并按列表 minimum_dist 中的最小距离返回“最相似”行的索引位置。

问题是这只返回最后一行最相似的索引位置:[6.0, 3.0, 4.0]

我想要的输出是这样的:

Original ID Matches
1 4,5,6
2 8,2,5

我试过了,但结果是一样的:

list_of_mins = []

for i in range(len(test)):
    query_node = test.iloc[i]
    # Find the distance between this node and everyone else
    euclidean_distances = test.apply(lambda row: distance.euclidean(row, query_node), axis=1)
    # Create a new dataframe with distances.
    distance_frame = pd.DataFrame(data="dist": euclidean_distances, "idx": euclidean_distances.index)
    distance_frame.sort_values("dist", inplace=True)
    smallest_dist = [dist["idx"] for idx, dist in distance_frame.iloc[1:4].iterrows()]
    for i in range(len(test)):
        list_of_mins.append(smallest_dist_ixs)

Does anyone know what's causing this problem? thank you!

【问题讨论】:

【参考方案1】:

如果您尝试在数据框中或(为了方便测试)字典中返回结果,会发生什么情况?例如:

df = pd.DataFrame(np.random.randint(1,10, size=(100,23)))
test = df[:50]
closest_nodes = 

for i in range(len(test)):
    query_node = test.iloc[i]
    # Find the distance between this node and everyone else
    euclidean_distances = test.apply(lambda row: distance.euclidean(row, query_node), axis=1)
    # Create a new dataframe with distances.
    distance_frame = pd.DataFrame(data="dist": euclidean_distances, "idx": euclidean_distances.index)
    distance_frame.sort_values("dist", inplace=True)
    closest_nodes[i] = [dist["idx"] for idx, dist in distance_frame.iloc[1:4].iterrows()]

我在您的代码中没有看到的是某种存储操作,可以将每个测试用例的一个结果放入永久结构中。

【讨论】:

您好,感谢您的回复 - 这也很有效,非常适合我的代码!【参考方案2】:

我没有可用的距离库,所以我将其更改为一个简单的总和,但在将其替换回距离后它应该可以工作

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(1, 10, size=(100, 23)))
test = df[:50]

dict_results = 'ids': [],
                'ids_min': []

n_min = 2

for i in range(len(test)):
    query_node = test.iloc[i]
    # Find the distance between this node and everyone else
    euclidean_distances = test.apply(lambda row: np.sum(row), axis=1)
    # Create a new dataframe with distances.
    # print(euclidean_distances)
    distance_frame = pd.DataFrame(data="dist": euclidean_distances,
                                        "idx": euclidean_distances.index)

    selected_min = distance_frame.sort_values("dist").head(n_min)
    dict_results['ids'].append(i)
    dict_results['ids_min'].append(', '.join(selected_min['idx'].astype('str')))

print(pd.DataFrame(dict_results))

我对您的代码添加了一些更改:

    添加了n_min 参数来定义第二列中需要多少元素(到最近行的索引数) 创建了一个用来保存结果的字典,以创建您想要的数据框。 在循环中添加了 append 以将每次迭代的结果添加到保存结果的字典中 在循环之后,如果您在 pd.DataFrame 中调用 dict,它将按照与 distance_frame 相同的方式进行解析

【讨论】:

嗨!这帮助很大,谢谢!效果很好

以上是关于For循环仅返回最后一项的主要内容,如果未能解决你的问题,请参考以下文章

Python“for in”循环打印列表中的最后一项

ArrayList循环仅输出最后一项[重复]

For循环遍历数组仅显示最后一个值

jQuery-UI 对话框仅显示 for 循环的最后一次迭代 [重复]

Python For循环仅将最后一个值附加到列表

无法在 v-for 循环中显示数组中的所有对象,仅显示最后一个对象