我有这个数据框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
(方向)来计算发生次数。
有两个不同的方向:E0
和O1
。
所以我做到了:
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
...
我该怎么做?
答案 0 :(得分:2)
使用第一级的Series.unstack
和参数fill_value
替换不存在的组合NaN
和dir
的新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()