【问题标题】:Add total row for each subgroup in a pandas dataframe为熊猫数据框中的每个子组添加总行
【发布时间】:2016-02-13 05:17:24
【问题描述】:

我有一个数据框,df:

BRAND ART_TYPE  YEAR_MONTH metrics  Value
aaa      xyz      201510       a   4500
aaa      xyz      201510       b   8500
bbc      abc      201510       c   3500
bbc      abc      201510       d  10000
xxx      def      201510       e  15000

我想为每组 (['BRAND','ART_TYPE','YEAR_MONTH']) 添加一个总行 所以结果应该是:

BRAND   ART_TYPE    YEAR_MONTH  metrics Value
aaa     xyz         201510      a       4500
aaa     xyz         201510      b       8500
aaa     xyz         201510      tot     13000
bbc     abc         201510      c       3500
bbc     abc         201510      d       10000
bbc     abc         201510      tot     13500
xxx     def         201510      e       15000
xxx     def         201510      tot     15000

如何做到这一点?我们有什么功能吗?我尝试了 apply 和 groupby 功能,但没有奏效。如果需要更多信息,请告诉我。

我尝试的代码添加了一列:

df['total'] = df.groupby(['BRAND','ART_TYPE','YEAR_MONTH']).apply(calctot)

def calctot(df):
   return(sum(df['Value']))

这给出了一个错误,即使它有效,这也会添加一列。

【问题讨论】:

    标签: pandas group-by sum row


    【解决方案1】:

    我必须根据推荐的输出更改输入数据框。
    我改进了函数calctot - 删除列然后附加总和行。 level_3 列是从旧索引创建的,我将其删除。应用函数groupbymetrics 列中的新值是NaN,所以我用值tot 填充它们。

    #  BRAND ART_TYPE  YEAR_MONTH metrics  Value
    #0   aaa      xyz      201510       a   4500
    #1   aaa      xyz      201510       b   8500
    #2   bbc      abc      201510       c   3500
    #3   bbc      abc      201510       d  10000
    #4   xxx      def      201510       e  15000
    
    
    def calctot(df):
        #delete columns
        df = df.drop(['BRAND', 'ART_TYPE', 'YEAR_MONTH'], axis=1)
        #append sum row, ignoring non-numeric column metrics
        return df.append(df.sum(numeric_only=True), ignore_index=True)
    
    #groupby and reset index
    df =  df.groupby(['BRAND','ART_TYPE','YEAR_MONTH']).apply(calctot).reset_index()
    #delete old index column
    df = df.drop(['level_3'], axis=1)
    #fill NaN to value tot
    df['metrics'] = df['metrics'].fillna('tot')
    
    print df
    #  BRAND ART_TYPE  YEAR_MONTH metrics  Value
    #0   aaa      xyz      201510       a   4500
    #1   aaa      xyz      201510       b   8500
    #2   aaa      xyz      201510     tot  13000
    #3   bbc      abc      201510       c   3500
    #4   bbc      abc      201510       d  10000
    #5   bbc      abc      201510     tot  13500
    #6   xxx      def      201510       e  15000
    #7   xxx      def      201510     tot  15000
    

    【讨论】:

      猜你喜欢
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多