【问题标题】:Add aggregated/summary lines in Pandas dataframe在 Pandas 数据框中添加聚合/摘要行
【发布时间】:2020-02-05 03:21:10
【问题描述】:

假设我有一个如下的数据框:

df = pd.DataFrame(np.array([[2018,'R1','C1',1],[2018,'R1','C2',2],[2018,'R1','C3',3],[2018,'R1','C4',4],[2018,'R1','C5',5],[2018,'R2','C6',6],[2018,'R2','C7',7],[2018,'R2','C8',8],[2018,'R2','C9',9],[2018,'R2','C10',10]]),columns=['Year', 'Region', 'Country', 'Spend'])

我想为每个可能的group by (groups) 添加摘要行,以便输出数据框如下所示:

我已经学会了如何根据StackOverflow post 将汇总/总计行添加为一列。但我想将这些总行合并到原始数据帧中,如上面的屏幕截图所示,我想用尽可能少的行来完成这一点(也就是说,避免像下面那样手动调用不同的groupby 组合):

df['ByYearTotalCount'] = df.groupby(['Year'])['Spend'].transform('sum')
df['ByYearByRegionTotalCount'] = df.groupby(['Year','Region'])['Spend'].transform('sum')

谁能帮我想出最好的pandas-like 方法来完成这个任务?提前感谢您的帮助!

【问题讨论】:

    标签: python pandas aggregate pandas-groupby


    【解决方案1】:

    首先使用groupby 获取总计/小计行,然后使用concat 获取结果数据帧

    df2 = df.groupby(['Year'])['Spend'].sum().reset_index()
    df3 = df.groupby(['Year', 'Region'])['Spend'].sum().reset_index()
    df = pd.concat([df, df2, df3], sort=False).fillna('All').sort_values(by=['Region', 'Country'])
    

    输出

    df2
       Year  Spend
    0  2018     55
    
    df3
       Year Region  Spend
    0  2018     R1     15
    1  2018     R2     40
    
    df
       Year Region Country  Spend
    0  2018    All     All     55
    0  2018     R1     All     15
    0  2018     R1      C1      1
    1  2018     R1      C2      2
    2  2018     R1      C3      3
    3  2018     R1      C4      4
    4  2018     R1      C5      5
    1  2018     R2     All     40
    9  2018     R2     C10     10
    5  2018     R2      C6      6
    6  2018     R2      C7      7
    7  2018     R2      C8      8
    8  2018     R2      C9      9
    

    【讨论】:

    • 谢谢!我最终做了类似的事情,但使用了append。但是您建议的解决方案看起来很整洁。我接受它是因为它完成了我想要的工作。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 2016-01-02
    • 2017-06-23
    • 2018-12-01
    • 1970-01-01
    • 2018-01-25
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多