如何在大熊猫中分组和聚集

时间:2018-10-09 12:02:55

标签: python pandas

我有以下熊猫数据框

  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 :(得分:2)

使用:

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. 首先由aggfirst进行汇总 和last
  2. assign减去后创建新列
  3. unstack重塑
  4. 通过add_prefix更改列名称
  5. 通过reset_indexrename_axis清除数据最后一次