有没有其他方法可以在 Pandas 中创建从所有其他行派生的逐行数据?



作为大学数据科学课程的一部分,我们被要求计算出最偏远的首都。我在这里问这个问题是因为我对自己的答案不满意,但在提交后,我没有得到更好的选择。

据我所知,这项任务需要三个部分:

  1. 获取首都位置数据
  2. 为长短对创建距离函数
  3. 用熊猫来寻找从首都到其他城市的最小距离

前两项任务微不足道。然而,我很难找到一种在不使用迭代器的情况下解决第三个任务的方法。距离函数需要一对lat/long值。我需要找到一种方法,将此函数应用于每一行,用于其他每一行。

capitals['closest'] = inf
for idx, row_x in capitals.iterrows():
capitals.at[idx,'closest'] = capitals.apply(lambda row_y: 
haversine(row_x['lat'],row_x['lng'],row_y['lat'],row_y['lng'])
if row_x['city'] != row_y['city']
else inf
, axis=1).min()

有没有办法嵌套对DataFrameapply方法的调用?是否有其他方法可以创建从所有其他行派生的逐行数据?

编辑:这是我的最终答案,以前使用了迭代器(请参阅提交历史记录(,但后来更新了更好的解决方案:https://github.com/maccaroo/worldcities/blob/main/world_cities.ipynb

当我准备发帖时,我在"类似问题"搜索中找到了解决方案,但我觉得我的答案不同,足以保证发帖。

首先,这是一篇(大部分(通过提问回答的帖子。然而,我一直收到这个错误:KeyError: ('city', 'occurred at index city', 'occurred at index city')

这篇文章让我越界了。解决方案是axis=1参数,它告诉apply在处理数据时使用列而不是行索引。

这是我的最后一个代码:

capitals['closest'] = inf
capitals['closest'] = capitals.apply(lambda row:
capitals.apply(lambda x: 
haversine(row['lat'],row['lng'],x['lat'],x['lng']) 
if row['city'] != x['city'] 
else inf
,axis=1)
,axis=1).min()

最新更新