groupby 操作后对 pandas 数据框行的计算

calculations on rows of pandas dataframe after groupby operation

我有销售数据,在对项目和年份添加 groupby 后,数据集如下所示。我想用下面的公式计算增长率

rate_of_increase = ((2019 年销售额 - 2018 年销售额) / 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

谢谢。

不是最好的方法,但你可以试试这个: 定义一个计算函数,并将其应用到你原来的 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

这会成功(假设您的数据按照您的示例排序,即按年份降序)

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