Pandas: более быстрый способ использовать groupby, чем shift?

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть DF следующим образом:

Указатель date_block_num shop_id item_id item_price item_cnt_month Дата
0 0 2 33 499.0 1.0 05.01.2013
1 0 2 491 600.0 1.0 09.01.2013
2 0 2 1007 449.0 3.0 11.01.2013
3 0 2 1010 449.0 1.0 21.01.2013
4 0 2 1023 299.0 2.0 06.01.2013

Я хочу создавать запаздывающие функции, используя shift() .

Я попробовал: df["last_1_month_sales"] = df.groupby(["date_block_num", "shop_id", "item_id"])["item_cnt_month"].shift(periods = 1, fill_value=0) . Однако, поскольку DF большой (~ 800 тыс. строк), функция Groupby занимает очень много времени. Есть ли лучший альтернативный способ ускорить этот процесс?

Я могу преобразовать его в cudf DataFrame for faster groupby, но он не поддерживает shift() функцию и не поддерживает преобразование объекта cudf Groupby обратно в объект Pandas.

Комментарии:

1. Это не очень большой фрейм данных, сколько времени это займет?

2. Около 1-2 минут, но это занимает примерно 80-90% моего процесса разработки функций, и я хочу немного ускорить его.

Ответ №1:

В репозитории cudf github открыт запрос функции для реализации shift функции с помощью groupby

Пока удивительная команда cuDF работает над этим, вы можете использовать функцию cudf GroupBy apply для использования shift операции после groupby. Пример кода:

 import pandas as pd
import dask.dataframe as dd
import cudf
# Create the dataframe
pdf = pd.DataFrame({
    "a": [0,1,0,1,1,0],
    "b": range(6),
    "c": ["a","b","c","d","e","f"]
})
gdf = cudf.from_pandas(pdf)

# Custom apply function
def grp_shift(df):
    df["d"] = df.b.shift(1)
    return df


print("pandas shift function : ")
print(pdf.groupby("a").b.shift(1))

print("cudfs shift function : ")
print(gdf.groupby("a").apply(grp_shift).d)