#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)