假设我有以下时间序列:
Timestamp Category
2014-10-16 15:05:17 Facebook
2014-10-16 14:56:37 Vimeo
2014-10-16 14:25:16 Facebook
2014-10-16 14:15:32 Facebook
2014-10-16 13:41:01 Facebook
2014-10-16 12:50:30 Orkut
2014-10-16 12:28:54 Facebook
2014-10-16 12:26:56 Facebook
2014-10-16 12:25:12 Facebook
...
2014-10-08 15:52:49 Youtube
2014-10-08 15:04:50 Youtube
2014-10-08 15:03:48 Vimeo
2014-10-08 15:02:27 Youtube
2014-10-08 15:01:56 DailyMotion
2014-10-08 13:27:28 Facebook
2014-10-08 13:01:08 Vimeo
2014-10-08 12:52:06 Facebook
2014-10-08 12:43:27 Facebook
Name: summary, Length: 600
我想计算每个星期和每年的每个类别(时间序列中的唯一值/因子)。
Example:
Week/Year Category Count
1/2014 Facebook 12
1/2014 Google 5
1/2014 Youtube 2
...
2/2014 Facebook 2
2/2014 Google 5
2/2014 Youtube 20
...
如何使用Python pandas实现这一目标?
答案 0 :(得分:18)
将系列转换为数据框并使用Pandas'可能最容易。 groupby
功能(如果您已有DataFrame,则直接跳到下面添加另一列)。
如果系列名为s
,请将其转换为DataFrame,如下所示:
>>> df = pd.DataFrame({'Timestamp': s.index, 'Category': s.values})
>>> df
Category Timestamp
0 Facebook 2014-10-16 15:05:17
1 Vimeo 2014-10-16 14:56:37
2 Facebook 2014-10-16 14:25:16
...
现在为周和年添加另一列(一种方法是使用apply
并生成一个周/年数字的字符串):
>>> df['Week/Year'] = df['Timestamp'].apply(lambda x: "%d/%d" % (x.week, x.year))
>>> df
Timestamp Category Week/Year
0 2014-10-16 15:05:17 Facebook 42/2014
1 2014-10-16 14:56:37 Vimeo 42/2014
2 2014-10-16 14:25:16 Facebook 42/2014
...
最后,按'Week/Year'
和'Category'
分组并与size()
汇总以获取计数。对于您问题中的数据,这会产生以下结果:
>>> df.groupby(['Week/Year', 'Category']).size()
Week/Year Category
41/2014 DailyMotion 1
Facebook 3
Vimeo 2
Youtube 3
42/2014 Facebook 7
Orkut 1
Vimeo 1
答案 1 :(得分:3)
为了更清楚一点,您不需要创建名为' week_num'的新列。第一
df.groupby(by=lambda x: "%d/%d" % (x.week(), x.year())).Category.value_counts()
函数by会自动调用索引的每个timestamp对象,将它们转换为星期和年份,然后按周和年分组。
答案 2 :(得分:2)
将您的TimeStamp列转换为周数,然后将该周数和value_count
分组变量分组,如下所示:
df.groupby('week_num').Category.value_counts()
我假设从TimeStamp列创建了新列week_num
。