#python #pandas #pandas-groupby
#python #pandas #pandas-groupby
Вопрос:
У меня есть фрейм данных с 4 полями: местоположение, год, неделя и продажи. Я хотел бы знать разницу в продажах между двумя годами, сохраняя детализацию набора данных. Я имею в виду, я хотел бы знать для каждого местоположения, года и недели, в чем разница с той же неделей другого года.
Следующее сгенерирует фрейм данных с аналогичной структурой:
raw_data = {'Location': ['A']*30 ['B']*30 ['C']*30,
'Year': 3*([2018]*10 [2019]*10 [2020]*10),
'Week': 3*(3*list(range(1,11))),
'Sales': random.randint(100, size=(90))
}
df = pd.DataFrame(raw_data)
Location Year Week Sales
A 2018 1 67
A 2018 2 93
A 2018 … 67
A 2019 1 49
A 2019 2 38
A 2019 … 40
B 2018 1 18
… … … …
Не могли бы вы показать мне, какой подход был бы наилучшим?
Большое вам спасибо
Комментарии:
1. Пожалуйста, укажите желаемый результат (я рекомендую вам уменьшить ввод, скажем, до 10 строк, и не делайте его случайным). А также, вы уже пробовали это сами? Полезно, если вы добавите свою попытку к вопросу.
2. Насколько я знаю
randint
, у меня нетsize
аргумента https://docs.python.org/3/library/random.html#random.randint . Это правильный кодrandom.randint(100, size=(90))
?3. @CarloZanocco Вероятно
np.random.randint
, тем не менее, OP следует уточнить.4. @SayandipDutta О, верно, я забыл об этом
5. Извините, я забыл добавить
from numpy import random
команду.
Ответ №1:
Вы можете сделать это с помощью groupby
и shift
:
df["Next_Years_Sales"] = df.groupby(["Location", "Week"])["Sales"].shift(-1)
df["YoY_Sales_Difference"] = df["Next_Years_Sales"] - df["Sales"]
Выборочная проверка:
df[(df["Location"] == "A") amp; (df["Week"] == 1)]
Out[37]:
Location Year Week Sales Next_Years_Sales YoY_Sales_Difference
0 A 2018 1 99 10.0 -89.0
10 A 2019 1 10 3.0 -7.0
20 A 2020 1 3 NaN NaN
Комментарии:
1. Спасибо! Это отлично работает. Я никогда не использовал метод shift () внутри groupby. Большое вам спасибо!