Множественные итерации над фреймом данных pandas

Для каждого сайта и месяца я пытаюсь вычислить сумму значений на соседних сайтах, используя 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

Что мне не хватает, из-за чего все строки, кроме последней, остаются пустыми?

Каков ваш ожидаемый результат? Мне кажется, что все значения столбца суммированы в последней строке, не знаю, что вы ожидаете от других строк

Martijn van Amsterdam 18.12.2018 08:36

В любом случае попробуйте вставить фреймы данных, если что-то не так, мы можем вам с этим помочь. Также вместо всего этого кода расскажите нам, что вы пытаетесь сделать, и ожидаемый результат.

yatu 18.12.2018 09:54

Ну, блин, я решил, и это, конечно, глупая ошибка. Мои переменные в 3-х циклах перекрывали и прерывали друг друга. Спасибо, что посмотрели на мою проблему и прокомментировали, это заставило меня переосмыслить представление кода!

Jackson 19.12.2018 03:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
54
0

Другие вопросы по теме