Как зациклить несколько групп, сохраняя одно значение константы на группу? - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь автоматизировать расчет for loop в 34 различных группах.У меня есть набор данных, который содержит точки X и Y для 400 районов, расположенных в 34 провинциях.Для каждой провинции я хочу рассчитать расстояние от столицы этой провинции до каждого из районов провинции.

Затем я хочу повторить расчет для столицы района следующей провинции и ее районов.

То, что я уже пробовал, чрезвычайно элементарно и не подходит для автоматизации ожидаемых результатов.

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])))

Вот как я решил эту проблему:

import pandas as pd
import numpy as np
import mpu

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

j = []
for i in range(399):
    j = df[df['Capital'] == 1][['Y', 'X', 'Province', 'District', 'Capital']]

j.rename(columns={'Y': 'CapY', 'X': 'CapX'}, inplace=True)

df1 = df.merge(j, how = 'left', on = ['Province']) # this is it!

container = []
for i in range(399):
    container.append(mpu.haversine_distance((df1['Y'][i], df1['X'][i]),
                                            (df1['CapY'][i], df1['CapX'][i]))) # working?

container = pd.Series(container)
df1 = pd.concat((df1, container.rename('distance')), axis = 1) 

Хотя есликто-нибудь все еще смотрит,

Я мог бы использовать некоторую помощь, чтобы выяснить, почему этот цикл работает:


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])) 

1 Ответ

0 голосов
/ 04 февраля 2019

Не видя структуру вашего фрейма данных, немного сложно дать подробности.Но то, что вы описали, это операция с вложенным циклом.в псевдокоде вы:

Loop over all of the provinces:
  identify the capital somehow
  Loop over all of the districts:
    calculate the distance (capital, district)

С данными о размере, которые вы описываете, это должно быть очень быстро.

Я думаю, что было бы проще не пытаться делать это в данныхРамка.Намного легче понять, что происходит.

edit: Чтобы получить пары провинций и столиц, вы можете сделать что-то вроде этого:

df_caps = df[df['ADM2ALT1EN'] == 'Centre'][['ADM1_EN', 'ADM2_EN']]

Это сделаетподмножество фрейма данных с двумя столбцами, которые, я думаю, вам нужны.Затем вы можете преобразовать это в список кортежей, чтобы упростить итерацию:

cap_pairs = [tuple(x) for x in df.caps.values]

Теперь у вас есть кое-что, что легко перебрать с помощью ...

for province, cap in cap_pairs:
    # do something 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...