如何对熊猫中的动态列进行分组和汇总

时间:2019-09-19 17:30:31

标签: python pandas

我在熊猫中有以下数据框

code    tank     nozzle_1   nozzle_2    nozzle_var    nozzle_sale
123     1        1          1           10            10
123     1        2          2           12            10
123     2        1          1           10            10
123     2        2          2           12            10
123     1        1          1           10            10
123     2        2          2           12            10

现在,我想生成所有合并到tank上的列的累积总和,并取出最后一个观察值。喷嘴_1和喷嘴_2的列是动态的,可能是喷嘴_3,喷嘴_4 ......喷嘴_n等。我正在熊猫中进行以下操作以获取累积量

## Below code for calculating cumsum of dynamic columns nozzle_1 and nozzle_2
cols= df.columns[df.columns.str.contains(pat='nozzle_\d+$', regex=True)] 
df.assign(**df.groupby('tank')[cols].agg(['cumsum'])\
          .pipe(lambda x: x.set_axis(x.columns.map('_'.join), axis=1, inplace=False)))
## nozzle_sale_cumsum is static column
df[nozzle_sale_cumsum] = df.groupby('tank')['nozzle_sale'].cumsum()

从上面的代码中,我将得到以下各列的总和

  tank  nozzle_1  nozzle_2  nozzle_var  nozzle_1_cumsum  nozzle_2_cumsum   nozzle_sale_cumsum
  1         1         1          10                1                1      10
  1         2         2          12                3                3      20
  2         1         1          10                1                1      10
  2         2         2          12                3                3      20
  1         1         1          10                4                4      30
  2         2         2          12                5                5      30

现在,我想获得所有3个累加器列的最后一个值,这些值将按槽分组。我可以使用pandas中的以下代码来做到这一点,但是它使用列名进行了硬编码。

 final_df= df.groupby('tank').agg({'nozzle_1_cumsum':'last',
                                   'nozzle_2_cumsum':'last',
                                   'nozzle_sale_cumsum':'last',
                                   }).reset_index()

以上代码存在的问题是喷嘴_1_cumsum,喷嘴_2_cumsum是硬编码的,不是这种情况。如何在带有动态列的熊猫中执行此操作。

1 个答案:

答案 0 :(得分:2)

怎么样:

df.filter(regex='_cumsum').groupby(df['tank']).last()

输出:

      nozzle_1_cumsum  nozzle_2_cumsum  nozzle_sale_cumsum
tank                                                      
1                   4                4                  30
2                   5                5                  30

您也可以将df.filter(...)替换为df.iloc[:,-3:]df[col_names]