我有一个包含两列的DataFrame。其中一个包含时间戳和另一个 - 某个动作的id。这样的事情:
2000-12-29 00:10:00 action1
2000-12-29 00:20:00 action2
2000-12-29 00:30:00 action2
2000-12-29 00:40:00 action1
2000-12-29 00:50:00 action1
...
2000-12-31 00:10:00 action1
2000-12-31 00:20:00 action2
2000-12-31 00:30:00 action2
我想知道在某一天已执行了多少某种类型的动作。 即对于每一天,我需要计算actionX的出现次数,并在每个日期用X轴上的日期和Y轴上的actionX出现次数绘制这些数据。
当然,只要迭代我的数据集,我就可以天真地计算每一天的行动。但是用pandas / matplotlib做什么是“正确的方法”?
答案 0 :(得分:15)
您可以使用
获取计数df.groupby([df.index.date, 'action']).count()
或者您可以使用此方法直接绘图
df.groupby([df.index.date, 'action']).count().plot(kind='bar')
您也可以将结果存储到count
,然后单独绘制。这假设你的索引已经是datetimeindex格式,否则按照上面@mkln的指示。
答案 1 :(得分:5)
从
开始 mydate col_name
0 2000-12-29 00:10:00 action1
1 2000-12-29 00:20:00 action2
2 2000-12-29 00:30:00 action2
3 2000-12-29 00:40:00 action1
4 2000-12-29 00:50:00 action1
5 2000-12-31 00:10:00 action1
6 2000-12-31 00:20:00 action2
7 2000-12-31 00:30:00 action2
你可以做到
df['mydate'] = pd.to_datetime(df['mydate'])
df = df.set_index('mydate')
df['day'] = df.index.date
counts = df.groupby(['day', 'col_name']).agg(len)
但也许有一种更直接的方式。无论如何,上述情况应该有效。
如果您想将计数用作DataFrame,我会将其转换回来
counts = pd.DataFrame(counts, columns=['count'])
答案 2 :(得分:1)
我发现组合 .count_values().plot.bar()
非常直观地绘制直方图。它还为您按正确的顺序排列类别,在许多类别过多的情况下,您只需执行 .count_values().iloc[:k].plot.bar()
。
因此,在您的情况下,我会做的是计算一个新的 Pandas 系列日期 + 操作,格式化为可读性,然后调用上面的代码片段之一。代码可能如下所示:
date_and_action = df['date'].astype(str).str.slice(0, 10) + '_' + df['action']
date_and_action.count_values().iloc[:k].plot.bar()