Операции Pandas groupby между группами

#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   201867
A   2019    1   49
A   2019    2   38
A   201940
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. Большое вам спасибо!