我有一些信息,其中包含有关多条消息的观看次数和点击次数的日期。我想用几小时来绘制视图和点击次数。
我已将数据强制转换为此类DataFrame:
sl = pd.DataFrame({'index':sendlog.index,
'idMessage': sendlog['idMessage'],
'View': pd.to_datetime(sendlog['dtFirstView']).apply(lambda x: x.replace(minute=0, second=0)),
'Click': pd.to_datetime(sendlog['dtFirstClick']).apply(lambda x: x.replace(minute=0, second=0))},
columns=('idMessage', 'View', 'Click')
)
sl.head(5)
显示:
idMessage View Click
0 728403 2016-12-12 05:00:00 NaT
1 728403 2016-12-12 02:00:00 NaT
2 727895 2016-12-12 15:00:00 NaT
3 727918 2016-11-30 09:00:00 2016-11-30 09:00:00
4 727895 2016-11-30 12:00:00 NaT
某些消息未被点击 - 有NaT
个值。
我想看到每个小时都有直方图的情节,每个小时都有一些观看次数和点击次数。
Here's一个类似的问题,但它仅在一个维度上进行分组。
如果我将它们分组并计算每个组的大小,我就无法将它们绘制为,因为我得到了一个numpy.int64
对象。
如何更好地策划这些事情?
答案 0 :(得分:1)
这是一种做法
sl_ = sl.set_index('idMessage')
cliks = sl_.Click.dropna()
# I want the Timestamps in the index so I can use pd.TimeGrouper
cliks = pd.Series(cliks.index.values, cliks.values)
views = sl_.View.dropna()
# I want the Timestamps in the index so I can use pd.TimeGrouper
views = pd.Series(views.index.values, views.values)
view_count = views.groupby([pd.TimeGrouper('H'), views]).count().rename('View')
clik_count = cliks.groupby([pd.TimeGrouper('H'), cliks]).count().rename('Click')
pd.concat([view_count, clik_count], axis=1).query('View >= 1 and Click >= 1')