【问题标题】:GroupBy aggregation based on condition and year wise sum using pandasGroupBy 聚合基于条件和使用 pandas 的年度总和
【发布时间】:2020-02-16 05:05:32
【问题描述】:

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

ID    Sector  Plot  Tenancy_Start_Date      Rental
1     SE1     A     2018-08-14              100
1     SE1     A     2019-08-18              200
2     SE1     B     2017-08-12              150
3     SE1     A     2020-02-12              300
5     SE2     A     2017-08-13              400
5     SE2     A     2019-08-12              300
6     SE2     B     2019-08-11              150
5     SE2     A     2020-01-10              300
7     SE2     B     2019-08-11              500

从上面我想准备下面的数据框作为 Sector 和 Plot 聚合级别。

预期输出:

Sector  Plot       Total_Rental   Rental_2017  Rental_2018  Rental_2019    Rental_2020
SE1     A          600            0            100          200            300
SE1     B          150            150          0            0              0
SE2     A          1000           400          0            300            300
SE2     B          650            0            0            650            0

【问题讨论】:

    标签: pandas pandas-groupby


    【解决方案1】:

    我会创建一个年份列:

    df['Year'] = df['Tenancy_State_date'].dt.year
    

    然后做你的分组

    df['Rent_by_cats'] = df.groupby(['Sector', 'Year', 'Plot'])['Rental'].transform(sum)
    

    然后最后将其移动到单独的列中

    yrs = df['Year'].unique().tolist()
    for y in yrs:
        df['Rental_' + str(y)] = 0
        df.loc[df['Year'] == y, 'Rental_' + str(y)] = df['Rent_by_cats']
    

    输出:

        ID Sector Plot Tenancy_Start_Date  Rental  Year  Rent_by_cats  Rental_2018  Rental_2019  Rental_2017  Rental_2020
    0   1    SE1    A         2018-08-14     100  2018           100          100            0            0            0
    1   1    SE1    A         2019-08-18     200  2019           200            0          200            0            0
    2   2    SE1    B         2017-08-12     150  2017           150            0            0          150            0
    3   3    SE1    A         2020-02-12     300  2020           300            0            0            0          300
    4   5    SE2    A         2017-08-13     400  2017           400            0            0          400            0
    5   5    SE2    A         2019-08-12     300  2019           300            0          300            0            0
    6   6    SE2    B         2019-08-11     150  2019           650            0          650            0            0
    7   5    SE2    A         2020-01-10     300  2020           300            0            0            0          300
    8   7    SE2    B         2019-08-11     500  2019           650            0          650            0            0
    

    【讨论】:

    • 请添加您的输出
    • 发布你的数据,我会的:)
    • ID Sector Plot Tenancy_Start_Date Rental 1 SE1 A 2018-08-14 100 1 SE1 A 2019-08-18 200 2 SE1 B 2017-08-12 150 3 SE1 A 2020-02-12 300 5 SE2 A 2017-08-13 400 5 SE2 A 2019-08-12 300 6 SE2 B 2019-08-11 150 5 SE2 A 2020-01-10 300 7 SE2 B 2019-08-11 500
    【解决方案2】:

    您可以这样做(df 是您的输入数据框):

    #in case if it's not already a datetime:
    df["Tenancy_Start_Date"]=pd.to_datetime(df["Tenancy_Start_Date"])
    
    df2=df.pivot_table(index=["Sector", "Plot"], columns=df["Tenancy_Start_Date"].dt.year, values="Rental", aggfunc=sum).fillna(0)
    
    df2.columns=[f"Rental_{col}" for col in df2.columns]
    
    df2["Total_Rental"]=df2.sum(axis=1)
    
    df2=df2.reset_index(drop=False)
    

    输出:

      Sector Plot  ...  Rental_2020  Total_Rental
    0    SE1    A  ...        300.0         600.0
    1    SE1    B  ...          0.0         150.0
    2    SE2    A  ...        300.0        1000.0
    3    SE2    B  ...          0.0         650.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-29
      • 2022-01-07
      • 2013-02-21
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2020-08-04
      • 2019-08-11
      相关资源
      最近更新 更多