как группировать и собирать в панд - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующий pandas dataframe

  index    key                                   start   end     nozzle  tank
  0        2018-01-01 02:00:01 - 02:30:00_1_1    2000    2003    1       1 
  1        2018-01-01 02:00:01 - 02:30:00_1_1    2003    2006    1       1 
  2        2018-01-01 02:00:01 - 02:30:00_1_1    2006    2008    1       1
  3        2018-01-01 02:00:01 - 02:30:00_1_1    2008    2010    1       1
  4        2018-01-01 02:00:01 - 02:30:00_1_1    2010    2012    1       1 
  5        2018-01-01 02:00:01 - 02:30:00_1_2    2002    2009    2       1 
  6        2018-01-01 02:00:01 - 02:30:00_1_2    2009    2011    2       1
  7        2018-01-01 02:00:01 - 02:30:00_1_2    2011    2013    2       1
  8        2018-01-01 02:00:01 - 02:30:00_1_2    2013    2015    2       1
  9        2018-01-01 03:30:01 - 04:00:00_1_3    2020    2022    3       1

Теперь я хочу взять первое и последнее наблюдение за каждым ключом и найти разницу, где есть только одно наблюдение ключа, оно должно вычислить разницу между end - start того же наблюдения.

расчет for nozzle 1 = 2012-2000 = 12 nozzle 2 = 2015-2002 = 13

Мой желаемый кадр данных будет

  index   key                                   nozzle_1  nozzle_2  nozzle_3
  0       2018-01-01 02:00:01 - 02:30:00_1_1    12        0         0 
  1       2018-01-01 02:00:01 - 02:30:00_1_2    0         13        0 
  2       2018-01-01 03:30:01 - 04:00:00_1_3    0         0         2

1 Ответ

0 голосов
/ 09 октября 2018

Использование:

df1 = (df.groupby(['key','nozzle'])
        .agg({'start':'first','end':'last'})
        .assign(dif = lambda x: x['end'] - x['start'])['dif']
        .unstack(fill_value=0)
        .add_prefix('nozzle_')
        .reset_index()
        .rename_axis(None, axis=1))
print (df1)
                                  key  nozzle_1  nozzle_2  nozzle_3
0  2018-01-01 02:00:01 - 02:30:00_1_1        12         0         0
1  2018-01-01 02:00:01 - 02:30:00_1_2         0        13         0
2  2018-01-01 03:30:01 - 04:00:00_1_3         0         0         2

Объяснение :

  1. Первый агрегат по agg с first и last
  2. Создать новый столбец по assign с вычитанием
  3. Изменить до unstack
  4. Изменить имена столбцов на add_prefix
  5. Последняя очистка данных на reset_index и rename_axis
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...