首页 > 解决方案 > 根据列标题中选择的级别对列求和

问题描述

我有一个 pd.dataframe,它看起来像这样。注意列名代表级别。

   df
             PC        0     1     2    3 
       0    PC_1      0.74  0.25  0.1  0.0   
       1    PC_1      0.72  0.26  0.1  0.1 
       2    PC_2      0.80  0.18  0.2  0.0
       3    PC_3      0.79  0.19  0.1  0.1 

我想在现有列旁边创建另外 4 列,并根据分配的条件移动值。

例如:如果 level =1,df 应该是这样的:

       df
             PC        0     1     2    3    0_1     1_1         2_1  3_1
       0    PC_1      0.74  0.25  0.1  0.0   0.0   (0.72+0.25)   0.1  0.0
       1    PC_1      0.72  0.26  0.1  0.1   0.0   (0.72+0.26)   0.1  0.1 
       2    PC_2      0.80  0.18  0.2  0.0   0.0   (0.80+0.18)   0.2  0.0
       3    PC_3      0.79  0.19  0.1  0.1   0.0   (0.79+0.19)   0.1  0.0

如果级别=3,

       df
             PC        0     1     2    3    0_3   1_3  2_3   3_3
       0    PC_1      0.74  0.25  0.1  0.0   0.0   0.0  0.0  sum(0.74+0.25+0.1+0.0)
       1    PC_1      0.72  0.26  0.1  0.1   0.0   0.0  0.0  sum(0.72+0.26+0.1+0.1)
       2    PC_2      0.80  0.18  0.2  0.0   0.0   0.0  0.0  sum(0.80+0.18+0.20+0.0)
       3    PC_3      0.79  0.19  0.1  0.1   0.0   0.0  0.0  sum(0.79+0.19+0.1+0.1)

我不知道如何解决问题,正在寻求帮助。

先感谢您。

标签: pythonpandas

解决方案


正如您根据标题列标题中选择的级别所写的那样,我了解:

  • 没有“外部”级别变量,
  • 级别(要求和的列数)仅来自源列名称。

因此,任务实际上是“连接”您的两个预期结果(您仅介绍了如何计算列1_13_1)并以相同的方式计算其他新列。

解决方案非常简洁。运行以下单行:

df = df.join(df.iloc[:, 1:].cumsum(axis=1)
    .rename(lambda name: str(name) + '_1', axis=1))

细节:

  • df.iloc[:, 1:]- 取所有行,从第 1 列开始(列号从 0 开始)。
  • cumsum(axis=1)- 水平计算累积总和。
  • rename(..., axis=1)- 重命名列。
  • lambda name: str(name) + '_1'- 计算新列名的 Lambda 函数。
  • 到目前为止的结果 - 新列。
  • df = df.join(...)- 加入原始 DataFrame 并将结果保存回df下。

推荐阅读