Python 如何在多个组上循环,同时每个组保持一个值常量?

Python 如何在多个组上循环,同时每个组保持一个值常量?,python,for-loop,Python,For Loop,我正在尝试在34个不同的组中自动执行for loop计算。我有一个数据集,其中包含34个省的400个地区的X和Y点。对于每个省,我想计算从该省的地区首府到该省每个地区的距离 然后,我想对下一个省的省会及其辖区重复计算 我已经尝试过的是非常基本的,并没有接近自动化的预期结果 import pandas as pd import mpu ### my basic coding ability would lead me to do something like this 34 times, ###

我正在尝试在34个不同的组中自动执行
for loop
计算。我有一个数据集,其中包含34个省的400个地区的X和Y点。对于每个省,我想计算从该省的地区首府到该省每个地区的距离

然后,我想对下一个省的省会及其辖区重复计算

我已经尝试过的是非常基本的,并没有接近自动化的预期结果

import pandas as pd
import mpu
### my basic coding ability would lead me to do something like this 34 times,
### manually hunting for the index with the capital and concating results

df = pd.read_csv('https://raw.githubusercontent.com/rocketfish88/democ/master/af-districts.csv')

new_df = df[0:27]
distance = []
for i in range(new_df.shape[0]):
    distance.append(mpu.haversine_distance((new_df['Y'][7], new_df['X'][7]), (new_df['Y'][i], new_df['X'][i])))
下面是我如何解决这个问题的: 虽然如果还有人在看,, 我需要一些帮助来弄清楚这个循环为什么有效:


container = []
for i in range(399):
    container.append(mpu.haversine_distance((df1['Y'][i], df1['X'][i]),
                                            (df1['CapY'][i], df1['CapX'][i])))
这个循环不起作用:

for i in range(399):
    df1['distance2'] = ''
    df1['distance2'][i] = mpu.haversine_distance((df1['Y'][i], df1['X'][i]),
                                            (df1['CapY'][i], df1['CapX'][i])) 

如果看不到数据帧的结构,就很难给出详细信息。但是,您所描述的是一个嵌套循环操作。在伪代码中,您可以:

Loop over all of the provinces:
  identify the capital somehow
  Loop over all of the districts:
    calculate the distance (capital, district)
根据您描述的大小数据,这应该非常快

我认为在数据框架中不尝试这样做会更容易。理解正在发生的事情要容易得多

编辑:要获得省份和首都的配对,您可以执行以下操作:

df_caps = df[df['ADM2ALT1EN'] == 'Centre'][['ADM1_EN', 'ADM2_EN']]
这将生成一个只包含2列的子集数据帧,我认为这是您想要的。然后,您可以将其转换为元组列表,以简化迭代:

cap_pairs = [tuple(x) for x in df.caps.values]
现在您有了一些易于迭代的东西

for province, cap in cap_pairs:
    # do something 

谢谢,我遇到的问题是我识别首都和地区的方式。它不会循环工作。我在这里指出了这个问题:
#关于为什么这不起作用有什么想法吗?
在主条目中添加后续内容。我可能是以一种非常笨拙的方式想出了这个问题,但我感谢你的评论,因为它帮助我以不同的方式思考这个问题。
for province, cap in cap_pairs:
    # do something