Python 如何在pandas中分组和聚合动态列

Python 如何在pandas中分组和聚合动态列,python,pandas,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 1

我在熊猫中有以下数据帧

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
现在,我想生成所有列的累积和,这些列在水箱上分组,并取出最后一个观察值。喷嘴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个cumsum列分组的最后一个值。我可以用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是硬编码的,但情况并非如此。如何在具有动态列的熊猫中执行此操作

那么:

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_name]

如何:

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[colu name]

{colName:'last'表示df.columns[-3:]}中的colName:'last'{colName:'last'表示df.columns[-3:}中的colName?我还需要一个油箱。当我重置_index()时,它不会给我一个坦克。尝试将
作为_index=True
传递给
groupby
。我这样做了,但没有给我坦克。我发现问题,用
last
替换
tail(1)
。明白了。谢谢:)我还需要一个水箱。当我重置_index()时,它不会给我一个坦克。尝试将
作为_index=True
传递给
groupby
。我这样做了,但没有给我坦克。我发现问题,用
last
替换
tail(1)
。明白了。谢谢:)