使用 pandas 按日期计算值的频率
Counting frequency of values by date using pandas
假设我有以下时间序列:
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
我想每周和每年对每个类别(时间序列中的唯一 Value/Factor)进行计数。
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 实现这一点?
将您的 TimeStamp 列转换为周数,然后按该周数和 value_count
分类变量分组,如下所示:
df.groupby('week_num').Category.value_counts()
我假设新列 week_num
是从 TimeStamp 列创建的。
将您的 Series 转换为 DataFrame 并使用 Pandas' groupby
功能可能是最简单的方法(如果您已经拥有 DataFrame,则直接跳到下面添加另一列)。
如果您的 Series 名为 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
并生成 week/year 数字的字符串):
>>> 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
为了更清楚一点,您不需要先创建一个名为 'week_num' 的新列。
df.groupby(by=lambda x: "%d/%d" % (x.week(), x.year())).Category.value_counts()
by函数会自动调用索引的每个时间戳对象将它们转换为周和年,然后按周和年分组。
假设我有以下时间序列:
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
我想每周和每年对每个类别(时间序列中的唯一 Value/Factor)进行计数。
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 实现这一点?
将您的 TimeStamp 列转换为周数,然后按该周数和 value_count
分类变量分组,如下所示:
df.groupby('week_num').Category.value_counts()
我假设新列 week_num
是从 TimeStamp 列创建的。
将您的 Series 转换为 DataFrame 并使用 Pandas' groupby
功能可能是最简单的方法(如果您已经拥有 DataFrame,则直接跳到下面添加另一列)。
如果您的 Series 名为 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
并生成 week/year 数字的字符串):
>>> 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
为了更清楚一点,您不需要先创建一个名为 'week_num' 的新列。
df.groupby(by=lambda x: "%d/%d" % (x.week(), x.year())).Category.value_counts()
by函数会自动调用索引的每个时间戳对象将它们转换为周和年,然后按周和年分组。