как группировать и объединять динамические столбцы в пандах - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть следующий фрейм данных в пандах

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

Теперь я хочу сгенерировать кумулятивную сумму всех столбцов, группирующихся по резервуару, и убрать последнее наблюдение.Столбцы nozzle_1 и nozzle_2 являются динамическими, это могут быть nozzle_3, nozzle_4 .... nozzle_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 столбцов сгруппированных по резервуару.Я могу сделать это с помощью следующего кода в пандах, но он жестко запрограммирован с именами столбцов.

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

Проблема с приведенным выше кодом - nozzle_1_cumsum, а nozzle_2_cumsum - жестко запрограммированный, что не так.Как я могу сделать это в пандах с динамическими колоннами.

1 Ответ

2 голосов
/ 19 сентября 2019

Как насчет:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...