Я ищу способ улучшить производительность следующей простой операции на 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]
, но, конечно, это неправильный синтаксис. Где-то "карта" должна войти в игру, но я не могу найти, как заставить это работать ... Есть идеи? Или, может быть, использование списочных представлений? Но я вижу в { ссылка }, что это не так быстро.
Спасибо.