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

2024-06-08 15:48:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我在熊猫馆有一张这样的桌子

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

也就是说,我的目标是按groupby和求和行by、PERIOD、REGION2、REGION、PRODUCT,但仅针对那些PRODUCT等于PLYC或PLYN的行,保留所有其他行不变,并用新名称返回求和的行 谢谢!你知道吗


Tags: productregionperiodproductioncwplyeufranc
1条回答
网友
1楼 · 发布于 2024-06-08 15:48:44

首先要将所有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

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

相关问题 更多 >