Добавить словарь к pandas кадру данных из указанного c индекса - PullRequest
1 голос
/ 12 февраля 2020

У меня есть 2 столбца в Pandas DataFrame и функция генератора словаря, которая берет входные данные из скользящих индексов данных и выдает выходные данные в виде словаря, а затем должна добавить ключи в виде столбца и значения в виде строк в существующий pandas кадр данных из указанного индекса c. Пример DataFrame:

+-------+---+---+
| Index | A | B |
+-------+---+---+
|     0 | 2 | 4 |
|     1 | 5 | 6 |
|     2 | 1 | 7 |
|     3 | 4 | 6 |
|     4 | 2 | 7 |
|     5 | 8 | 4 |
|     6 | 3 | 1 |
|     7 | 8 | 2 |
+-------+---+---+

Код, который берет входные строки (окно) из кадра данных, приведен ниже:

def stack(df, window=3):
    for i in range(0, df.shape[0] - window):
        dfp = df[i:i+window]
        mp = addition(dfp) #a dict generator function to add 3 previous values of column a and b and give output with a single dict {'C': value, 'D': value}
        for key, value in mp.items():      # to assign keys as column and values as rows
            df.loc['i+window', key] = value   # to assign rows from a specific index -3
    return df

Функция for-l oop создает 1 словарь с каждый l oop, который выглядит следующим образом:

{'C': 8, 'D': 17}  #1st loop
{'C': 10, 'D': 19} #2nd loop
{'C': 7, 'D': 20}  #3rd loop
{'C': 14, 'D': 17} #4th loop
{'C': 13, 'D': 12} #5th loop

Но есть ошибка в выводе, в то время как применение вышеупомянутой более медленной функции делает все значения строк в NaN, кроме последнего. Я хочу, чтобы ожидаемый вывод добавлялся к кадру данных строка за строкой с каждым l oop, а окончательный кадр данных должен выглядеть следующим образом:

+-------+---+---+-----+-----+
| Index | A | B |  C  |  D  |
+-------+---+---+-----+-----+
|     0 | 2 | 4 | NaN | NaN |
|     1 | 5 | 6 | NaN | NaN |
|     2 | 1 | 7 | 8    | 17 |
|     3 | 4 | 6 | 10   | 19   |
|     4 | 2 | 7 | 7   | 20  |
|     5 | 8 | 4 | 14   | 17   |
|     6 | 3 | 1 | 13   | 12  |
+-------+---+---+-----+-----+

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

1 Ответ

1 голос
/ 12 февраля 2020

Другой вариант вместо цикла:

df.combine_first(pd.DataFrame(dd_list, index=range(window,len(dd_list)+window)))

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

dd_list = [{'C': 8, 'D': 17},  #1st loop
{'C': 10, 'D': 19}, #2nd loop
{'C': 7, 'D': 20},  #3rd loop
{'C': 14, 'D': 17}, #4th loop
{'C': 13, 'D': 12}, ]

window = 2
for n, i in enumerate(dd_list):
    df = df.combine_first(pd.DataFrame(i, index=[n+window]))
print(df)

Вывод:

   A  B     C     D
0  2  4   NaN   NaN
1  5  6   NaN   NaN
2  1  7   8.0  17.0
3  4  6  10.0  19.0
4  2  7   7.0  20.0
5  8  4  14.0  17.0
6  3  1  13.0  12.0
7  8  2   NaN   NaN

Как и предлагал @QuangHoang, для генерации вашего вывода вы можете сделать это с помощью метода:

df.join(df.rolling(3).sum().rename(columns={'A':'C', 'B':'D'}))

Вывод:

       A  B     C     D
Index                  
0      2  4   NaN   NaN
1      5  6   NaN   NaN
2      1  7   8.0  17.0
3      4  6  10.0  19.0
4      2  7   7.0  20.0
5      8  4  14.0  17.0
6      3  1  13.0  12.0
7      8  2  19.0   7.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...