Векторизация (довольно простой) операции в мультииндексированном pandas DataFrame - PullRequest
0 голосов
/ 07 января 2020

Я ищу способ улучшить производительность следующей простой операции на Pandas DataFrame, возможно, используя векторизацию. Для объяснения сначала создайте мультииндексированный DataFrame:

import pandas as pd
df = pd.DataFrame([[1, 'a' , 1, 10], [1, 'b', 2, 20], [2, 'a', 5, 30]], columns=['x', 'y', 'z', 't'])
df = df.set_index(['x', 'y'])
df
        z   t
x   y       
1   a   1   10
    b   2   20
2   a   5   30

Затем я добавляю / обновляю определенные строки, заданные их мультииндексом:

for i in range(5):
    df.loc[(5-i,'a'), :] = [i, 7]
df = df.sort_index()
df

, что дает

          z       t
x   y       
1   a   4.0     7.0
    b   2.0    20.0
2   a   3.0     7.0
3   a   2.0     7.0
4   a   1.0     7.0
5   a   0.0     7.0

и это желаемый результат. Проблема в том, что я должен сделать это тысячу раз с заменой range (5) на range (10 ** 5), поэтому мне нужно улучшить производительность. Опять же: для некоторых значений i это добавит новую строку, а для некоторых других значений это обновит существующую строку (дополнительный вопрос: в последнем случае я бы хотел, чтобы "7" не перезаписывал возможное существующее значение то есть я хотел бы написать 7 только в том случае, если в float есть NaN). Это похоже на то, что можно векторизовать, но я не знаю как. Идея будет выглядеть примерно так:

i = list(range(5))
df.loc[(5-i,'a'), :] = [i, 7]

, но, конечно, это неправильный синтаксис. Где-то "карта" должна войти в игру, но я не могу найти, как заставить это работать ... Есть идеи? Или, может быть, использование списочных представлений? Но я вижу в { ссылка }, что это не так быстро.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...