【问题标题】:write a function to groupby year and calculate the average and count the size in pandas编写一个函数到 groupby year 并计算平均值并计算 pandas 的大小
【发布时间】:2020-01-07 17:16:00
【问题描述】:

我有一个如下所示的数据框

Contract_ID    Place         Contract_Date      Price
1              Bangalore     2018-10-25         100
2              Bangalore     2018-08-25         200
3              Bangalore     2019-10-25         300
4              Bangalore     2019-11-25         200
5              Bangalore     2019-10-25         400
6              Chennai       2018-10-25         100
7              Chennai       2018-10-25         200
8              Chennai       2018-10-25         100
9              Chennai       2018-10-25         300
10             Chennai       2019-10-25         400
11             Chennai       2019-10-25         600

从上面我想使用熊猫生成下表。

预期输出:

Place       Year     Number_of_Contracts    Average_Price   
Bangalore   2018     2                      150
Bangalore   2019     3                      300
Chennai     2018     4                      175
Chennai     2019     2                      500

尝试了下面的代码,它工作正常。但我想将下面的代码转换为函数。任何帮助将不胜感激。

df['Contract_Date'] = pd.to_datetime(df['Contract_Date'])
df1 = (df.groupby(['Place', df['Contract_Date'].dt.year.rename('Year')])
         .agg(Number_of_Contracts=('Contract_ID','size'),
              Average_Price=('Price','mean'))
         .reset_index())

【问题讨论】:

    标签: pandas function pandas-groupby


    【解决方案1】:

    用途:

    def func(df):
        df['Contract_Date'] = pd.to_datetime(df['Contract_Date'])
        return  (df.groupby(['Place', df['Contract_Date'].dt.year.rename('Year')])
                   .agg(Number_of_Contracts=('Contract_ID','size'),
                        Average_Price=('Price','mean'))
                   .reset_index())
    

    然后调用函数:

    df1 = func(df)
    

    或者使用DataFrame.pipe:

    df1 = df.pipe(func)
    

    编辑:

    def func(df, dates, place, id1, price):
        df[dates] = pd.to_datetime(df[dates])
        return  (df.groupby([place, df[dates].dt.year.rename('Year')])
             .agg(Number_of_Contracts=(id1,'size'),
                  Average_Price=(price,'mean'))
             .reset_index())
    df1 = func(df, 'Contract_Date', 'Place', 'Contract_ID', 'Price')
    

    print (df1)
           Place  Year  Number_of_Contracts  Average_Price
    0  Bangalore  2018                    2            150
    1  Bangalore  2019                    3            300
    2    Chennai  2018                    4            175
    3    Chennai  2019                    2            500
    

    【讨论】:

    • 是否可以在函数内部传递列名。因此,以后如果我需要与其他列相同,我只需要传递该函数。
    • @ALI - 当然,你能更具体一点吗?列名是什么?
    • 在这种情况下,地点、合同日期、合同 ID 和价格
    【解决方案2】:

    这段代码也有效:

    pivot=df.pivot_table(index=['Place',df['Contract_Date'].dt.year.rename('Year')],
                   values='Price',aggfunc=['count','sum']).reset_index()
    pivot.columns=pivot.columns.droplevel(1)
    
        Place   Year    count   sum
    0   Bangalore   2018    2   200
    1   Bangalore   2019    3   300
    2   Chennai     2018    4   400
    3   Chennai     2019    2   200
    

    注意:我的PRICE栏和你的不一样

    【讨论】:

      猜你喜欢
      • 2020-04-20
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2019-12-13
      • 2020-06-24
      • 1970-01-01
      相关资源
      最近更新 更多