绘制Pandas DataFrame中出现的次数

时间:2014-01-24 11:39:12

标签: python matplotlib pandas

我有一个包含两列的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做什么是“正确的方法”?

3 个答案:

答案 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()