groupby操作后对熊猫数据帧的行进行计算

时间:2020-02-02 10:59:10

标签: python pandas dataframe pandas-groupby percentage

我有销售数据,并在项目和年份上添加了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

谢谢。

2 个答案:

答案 0 :(得分:1)

不是最好的方法,但是您可以尝试以下方法: 定义用于计算的函数,并将其应用于原始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

答案 1 :(得分:1)

这可以解决问题(假设您的数据按照示例进行排序,即按年份降序)

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