Пересечение нескольких строк в одном DataFrame - PullRequest
0 голосов
/ 02 июня 2019

У меня есть DataFrame of Temperatures 1000s строк (данные временных рядов) и 40 столбцов (40 точек в водосборном бассейне). Записи в этом фрейме данных равны нулю и единице (1 означает активную часть водосбора, а ноль означает неактивную часть). Я хочу разместить количество пересеченных значений в отдельном столбце (с именем inter) в одном и том же кадре данных.

Ожидаю вывод таким образом [прикрепленное изображение]

  • значение в первой строке интер должно быть равно нулю, так как все записи равны нулю и никакая часть не активна в первый день

  • значение во 2-й строке интер должно быть 4, так как четыре части активны в день 2.

  • значение в 3-й строке интер должно быть 3 (количество пересеченных значений из всех вышеперечисленных строк, включая 3-й ряд) [введите описание изображения здесь] [1]. Зеленые прямоугольники на изображении показывают значение для 3-й строки

  • значение в 4-й строке интер должно быть числом пересеченных значений все вышеприведенные ряды (желтая заштрихованная область на изображении).

  • аналогично синие прямоугольники показывают значение для 5-й строки, а красные - значение для шестой строки и т. д.

Примечание: для каждой строки я буду считать пересечение всех вышеприведенных строк

Here is Expected Output

1 Ответ

0 голосов
/ 03 июня 2019

Я заслуживаю награду за это :) Вот вам ответ:

import pandas as pd
import numpy as np

# setup test data
data = {'0': [0, 0, 0, 1, 0], '1': [0, 0, 1, 0, 1], '2': [0, 0, 0, 1, 0], '3': [0, 0, 1, 1, 1], '4': [0, 1, 1, 1, 0]
, '5': [0, 0, 0, 0, 1], '6': [0, 1, 1, 1, 0], '7': [0, 0, 1, 0, 1], '8': [0, 1, 0, 1, 0], '9': [0, 1, 1, 0, 0],
    '10': [0, 0, 1, 0, 0], '11': [0, 0, 0, 1, 1], '12': [0, 0, 0, 1, 1]}
data = pd.DataFrame(data=data)

# collect inter data
inter_data = []
for main_index, main_row in data.iterrows():

    # select data for calculations
    selected_data = data.loc[0:main_index,:]

    # handle firs row with 0 values
    if not 1 in main_row.values:
        inter_data.append(0)
    else:
        # handle second row
        if selected_data.shape[0] == 2:
          inter_data.append(selected_data[1:2].values[0].sum())
        # handle rest of data
        else:
            # drop last row from selected data
            selected_data = selected_data[:-1]
            # sum selected data
            summed_data = 0
            for index, row in selected_data.iterrows():
                summed_data += row.values

            # get position of 1
            positions = np.where(main_row.values == 1)
            # get summed data based on position
            positions_data = summed_data[positions[0]]
            # sum occurance in data
            inter_data.append((positions_data >= 1).sum())

# add inter data to raw data
data['inter'] = pd.DataFrame(inter_data)

Выход:

   0  1  2  3  4  5  6  7  8  9  10  11  12  inder
0  0  0  0  0  0  0  0  0  0  0   0   0   0      0
1  0  0  0  0  1  0  1  0  1  1   0   0   0      4
2  0  1  0  1  1  0  1  1  0  1   1   0   0      3
3  1  0  1  1  1  0  1  0  1  0   0   1   1      4
4  0  1  0  1  0  1  0  1  0  0   0   1   1      5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...