вычисления на строках pandas данных после групповой операции - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть данные о продажах, и после добавления группы по номеру и году набор данных выглядит следующим образом. Я хочу рассчитать коэффициент увеличения по следующей формуле:

rate_of_increase = ((SalesAmount для 2019 г. - Сумма продаж за 2018 г.) / SalesAmount за 2018 г.) * 100

      district    item  Year   salesAmount 
      Arba        coil  2019       300
                        2018       50
      Arba        pen   2019       30
                        2018       200
      Arba        hat   2019       30
                        2018       20
      Cebu        oil   2019       300
                        2018       500
      Cebu        pen   2019       120
                        2018       10

Вывод:

   district   item   rate_increase(%)
     Arba     coil    500
     Arba     pen    -85
     Arba     hat     50
     Cebu     oil    -40
     Cebu     pen     1100

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Это поможет (если ваши данные отсортированы в соответствии с вашим примером, то есть по годам)

df=df.sort_values(by=['district', 'item','year'], ascending=False)

df["rate_increase"]=df.groupby(["district", "item"])["salesAmount"].diff().div(df["salesAmount"]).mul(-100)

df2=df.loc[df["year"].eq(2018)].drop(["year", "salesAmount"], axis=1).drop_duplicates().reset_index(drop=True)

Выходы:

  district  item  rate_increase
0     Cebu   pen         1100.0
1     Cebu   oil          -40.0
2     Arba   pen          -85.0
3     Arba   hat           50.0
4     Arba  coil          500.0
1 голос
/ 02 февраля 2020

Не лучший подход, но вы можете попробовать это: определите функцию для расчета и примените ее к исходному df

def rate_of_increase(x):
    amt_2019=x[x['Year']==2019]['salesAmount']
    amt_2018=x[x['Year']==2018]['salesAmount']
    rate_of_increase = ((int(amt_2019) -int(amt_2018)) / int(amt_2018)) * 100
    return (rate_of_increase)

и примените к вашему df для создания нового кадра данных

df2=pd.DataFrame()

df2[['district' ,'item' ,'rate']]=df.groupby(['district', 'item']).apply(lambda x: rate_of_increase(x)).reset_index()

Вывод:

   district item    rate
0   Arba    coil    500.0
1   Arba    hat     50.0
2   Arba    pen     -85.0
3   Cebu    oil     -40.0
4   Cebu    pen     1100.0
...