Для каждого сайта и месяца я пытаюсь вычислить сумму значений на соседних сайтах, используя Pandas DataFrame и три цикла. Исходный DataFrame - это df1, см. Ниже.
| Site name | Lat | Lon | March 2018 | April 2018 | May 2018 |
|-----------|-------|--------|------------|------------|----------|
| A | 10.0 | 15.0 | 1 | 2 | 3 |
| B | 10.1 | 15.0 | 1 | 2 | 3 |
| C | 12.0 | 100.0 | 1 | 2 | 3 |
Цикл 1) Начать с первого столбца, содержащего данные
Цикл 2) Получите координаты первого сайта для сравнения со всеми остальными сайтами
Цикл 3) Сравните координаты первого участка с каждым участком; если расстояние между ними (рассчитанное по формуле Хаверсина, не указано) меньше, чем Rtarget, добавьте к мсум, который представляет собой месячную сумму значений на всех участках в пределах расстояния Rtarget от исходного участка.
Вывод идет в пустой DataFrame, df2, с таким же индексом и столбцами, как df1. На каждой итерации цикла 2 должно быть окончательное значение мсум, которое следует вводить в то же место (индекс и столбец) в df2, что и в цикле 2.
В настоящее время мой код создает df2, который выглядит так:
| Lat | Lon | March 2018 | April 2018 | May 2018 |
| Site name |-----|-----|------------|------------|----------|
| A | 0 | 0 | 0 | 0 | 0 |
| B | 0 | 0 | 0 | 0 | 0 |
| C | 0 | 0 | 3 | 6 | 9 |
Хотя вместо этого df2 должен выглядеть так:
| Lat | Lon | March 2018 | April 2018 | May 2018 |
| Site name |-----|-----|------------|------------|----------|
| A | 0 | 0 | 2 | 4 | 6 |
| B | 0 | 0 | 2 | 4 | 6 |
| C | 0 | 0 | 1 | 2 | 3 |
Мой код ниже:
# Create empty data frame with identical columns
df1 = pd.DataFrame(0, index=df.index, columns=df.columns)
Rtarget = 500 # Set the target distance to X miles
# Iterate through each month of data
for column, row in df.iloc[:,2:].iteritems():
# Select the initial site and define the starting coordinates
for index, row in df.iterrows():
lat01 = row['Latitude']
lon01 = row['Longitude']
msum = 0 # set monthly sum equal to zero
# Iterate through each comparison site and define comparison coordinates
for index, row in df.iterrows():
lat02 = row['Latitude']
lon02 = row['Longitude']
distance = haversine(lon01, lat01, lon02, lat02)
if distance <= Rtarget:
msum += row[column] # Add the value to the monthly sum
# Place monthly sum into the corresponding location in the empty dataframe, df1
df1[column][index] = msum
Что мне не хватает, из-за чего все строки, кроме последней, остаются пустыми?
В любом случае попробуйте вставить фреймы данных, если что-то не так, мы можем вам с этим помочь. Также вместо всего этого кода расскажите нам, что вы пытаетесь сделать, и ожидаемый результат.
Ну, блин, я решил, и это, конечно, глупая ошибка. Мои переменные в 3-х циклах перекрывали и прерывали друг друга. Спасибо, что посмотрели на мою проблему и прокомментировали, это заставило меня переосмыслить представление кода!
Каков ваш ожидаемый результат? Мне кажется, что все значения столбца суммированы в последней строке, не знаю, что вы ожидаете от других строк