Groupby和sum行汇总PRODUCT列的多个值

时间:2015-09-28 15:33:31

标签: python pandas aggregate

我在pandas中有这样的表

PERIOD  REGION2 REGION  PRODUCT Production  NSLOG   CHIPS   SSAW
2010    FRANC   cw_eu   PLYC           100     10       5   
2010    FRANC   cw_eu   PLYN           230             30   
2011    FINLA   n_eu    PLYC           800      1       
2011    FINLA   n_eu    PLYN           200              4   
2011    FRANC   cw_eu   PLYC           100      3       
2011    FRANC   cw_eu   PLYN           200      7       2   
2010    AUSTR   cw_eu   CWC            248  57.04   78.78   
2010    AUSTR   cw_eu   CWF            1017                 58.11
2010    AUSTR   cw_eu   DissP          282     93.6          1056

我希望实现这样的目标:

PERIOD  REGION2 REGION  PRODUCT Production  NSLOG   CHIPS   SSAW
2010    FRANC   cw_eu   PLY            330     10      35   
2011    FINLA   n_eu    PLY           1000      1       4   
2011    FRANC   cw_eu   PLY            300     10       2   
2010    AUSTR   cw_eu   CWC            248  57.04   78.78   
2010    AUSTR   cw_eu   CWF            1017                 58.11
2010    AUSTR   cw_eu   DissP          282           93.6    1056

,即我的目标是对行,PERIOD,REGION2,REGION,PRODUCT进行分组和求和,但仅适用于PRODUCT等于PLYC或PLYN且其他所有行保持不变的行,并返回带有新名称PLY的求和行 谢谢!

1 个答案:

答案 0 :(得分:1)

您首先要对所有PLYCPLYN产品进行分组并重置索引。然后,您使用新值PRODUCT创建PLY列。

现在,将这些分组结果连接到原始数据框中的数据(但不包括PLYCPLYN产品)。然后在您想要的字段上设置索引,您就可以了。

grouped_products = ['PLYC', 'PLYN']
gb = (df[df.PRODUCT.isin(grouped_products)]
      .groupby(['PERIOD', 'REGION2', 'REGION'])
      .sum()
      .reset_index())
gb['PRODUCT'] = 'PLY'

result = pd.concat([gb, df.loc[~df.PRODUCT.isin(grouped_products), :]], ignore_index=True)
result.set_index(['PERIOD', 'REGION2', 'REGION', 'PRODUCT'], inplace=True)
>>> result.loc[:, ['Production', 'NSLOG', 'CHIPS', 'SSAW']]
                               Production  NSLOG  CHIPS     SSAW
PERIOD REGION2 REGION PRODUCT                                   
2010   FRANC   cw_eu  NaN             330  10.00  35.00      NaN
2011   FINLA   n_eu   NaN            1000   1.00   4.00      NaN
       FRANC   cw_eu  NaN             300  10.00   2.00      NaN
2010   AUSTR   cw_eu  CWC             248  57.04  78.78      NaN
                      CWF            1017    NaN    NaN    58.11
                      DissP           282  93.60    NaN  1056.00

请注意,结果的任何差异都应该归因于导入上面的数据集时不正确的列对齐。