【问题标题】:Adding a row of totals to a dataframe将一行总计添加到数据框
【发布时间】:2018-08-03 18:02:12
【问题描述】:

我有一个数据框,我试图弄清楚如何向每个客户添加一行,以总结每个客户的小时数。这是我的数据框的示例:

                              hours
client           month

A               January       203.50
                February      227.75
                March         159.75
                April         203.25
                May           199.90

B               January        203.50
                February       227.75
                March         159.75
                April          203.25
                May            199.90

C               January       203.50
                February      227.75
                March          159.75
                April         203.25
                May           199.90

我想为每个客户添加一个汇总小时数的新行。它看起来像这样:

                           hours
client           month

A               January    203.50
                February   227.75
                March      159.75
                April      203.25
                May        199.90
                Total     1000.34

B               January    203.50
                February   227.75
                March      159.75
                April      203.25
                May       199.90
                Total     1000.34

C               January   203.50
                February   227.75
                March      159.75
                April      203.25
                May       199.90
                Total     1000.34

我已经厌倦了编写一个遍历每个客户端的 for 循环,总结时间,然后将新行附加到每个客户端。我正在尝试的循环看起来像这样

df 的小时数: df.append(pd.Series(vp.sum(), name='Total'

但是,这不起作用。任何帮助将不胜感激!

【问题讨论】:

    标签: pandas sum append


    【解决方案1】:

    IIUC,你可以使用concat

    pd.concat([df,df.sum(level=0).assign(month='Total').set_index('month',append=True)]).sort_index()
    Out[1754]: 
                      hours
    client month           
    A      April     203.25
           February  227.75
           January   203.50
           March     159.75
           May       199.90
           Total     994.15
    B      April     203.25
           February  227.75
           January   203.50
           March     159.75
           May       199.90
           Total     994.15
    C      April     203.25
           February  227.75
           January   203.50
           March     159.75
           May       199.90
           Total     994.15
    

    【讨论】:

    • 我要把它放在一个for循环中吗?我写了你所说的,而不是在每个客户端的末尾添加一个名为“Total”的行,而是在 df 的末尾添加了所有 Total 行
    • @TimothyMcwilliams 你看到 sort_index 了吗?
    • @TimothyMcwilliams Yw~ 快乐编码
    【解决方案2】:

    您可以unstack 然后添加该列。

    df.unstack().hours.assign(Total=lambda d: d.sum(1)).stack().to_frame('hours')
    
                      hours
    client month           
    A      April     203.25
           February  227.75
           January   203.50
           March     159.75
           May       199.90
           Total     994.15
    B      April     203.25
           February  227.75
           January   203.50
           March     159.75
           May       199.90
           Total     994.15
    C      April     203.25
           February  227.75
           January   203.50
           March     159.75
           May       199.90
           Total     994.15
    

    保留原始行顺序的变体:

    # get old order of months
    months = pd.unique(df.index.get_level_values(1)).tolist()
    
    # create total dataframe with to levels of index
    totals = pd.DataFrame.from_dict({
        (client, 'Total'): {'hours': v}
        for client, v in df.hours.sum(level=0).items()
    }, 'index')
    
    # append and reindex
    df.append(totals).sort_index().reindex(months + ['Total'], level=1)
    
                      hours
    client month           
    A      January   203.50
           February  227.75
           March     159.75
           April     203.25
           May       199.90
           Total     994.15
    B      January   203.50
           February  227.75
           March     159.75
           April     203.25
           May       199.90
           Total     994.15
    C      January   203.50
           February  227.75
           March     159.75
           April     203.25
           May       199.90
           Total     994.15
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多