Groupby 和 sum 行以聚合 PRODUCT 列的多个值

Groupby and sum rows to aggregate multiple values of PRODUCT column

我在pandas

中有一个这样的table
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 的那些行,而所有其他行保持不变,return 求和行使用新名称 PLY 谢谢!

您首先要对所有 PLYCPLYN 产品进行分组并重置索引。然后,您使用 PLY.

的新值创建 PRODUCT

现在,将这些分组结果连接到原始数据框中的数据(但不包括 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

请注意,结果中的任何差异应该只是由于导入上述数据集时列对齐不正确造成的。