使用groupby的一列创建带有熊猫的X个新列

时间:2019-03-25 12:14:23

标签: python pandas

我有这个数据框df

                     date dir
0     2018-01-23 11:39:41  O1
1     2018-01-23 12:47:58  E0
2     2018-01-23 13:01:19  O1
3     2018-01-23 13:01:21  O1
4     2018-01-23 13:06:06  O1
5     2018-01-23 13:32:55  O1
6     2018-01-23 13:33:56  O1
7     2018-01-23 13:33:58  O1
8     2018-01-23 13:46:47  E0
9     2018-01-23 14:04:01  E0
10    2018-01-23 14:04:39  O1
11    2018-01-23 14:09:16  E0
12    2018-01-23 14:17:46  E0
...

我想按date(每小时)和dir(方向)来计算发生次数。 有两个不同的方向:E0O1

所以我做到了:

df = df.groupby(['dir',pd.Grouper(key='date', freq='H')]).size()

我当然有这样的东西:

dir  date               
E0   2018-01-23 12:00:00     1
     2018-01-23 13:00:00     1
     2018-01-23 14:00:00     5
...
O1   2018-05-21 19:00:00     1
     2018-05-21 20:00:00     1
     2018-05-22 06:00:00     2
...

但是我想为每个不同的方向创建一个新列:

                date    E0 O1
 2018-05-21 19:00:00     1  0
 2018-05-21 20:00:00     1  2
 2018-05-22 06:00:00     2  0
...

我该怎么做?

2 个答案:

答案 0 :(得分:2)

使用第一级的Series.unstack和参数fill_value替换不存在的组合NaNdir的新date值:

df = df.groupby(['dir',pd.Grouper(key='date', freq='H')]).size().unstack(0, fill_value=0)
print (df)
dir                  E0  O1
date                       
2018-01-23 11:00:00   0   1
2018-01-23 12:00:00   1   0
2018-01-23 13:00:00   1   6
2018-01-23 14:00:00   3   1

答案 1 :(得分:1)

另一个可能的解决方案是使用pd.pivot_table()

df.pivot_table(index= ['date'], columns='dir', aggfunc='size', fill_value=0).resample('1H').sum()