【问题标题】:Counting frequency of values by date using pandas使用熊猫按日期计算值的频率
【发布时间】:2015-03-05 13:45:00
【问题描述】:

假设我有以下时间序列:

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 实现这一点?

【问题讨论】:

    标签: pandas datetime dataframe count time-series


    【解决方案1】:

    将您的 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 并生成一串周/年数字):

    >>> 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
    

    【讨论】:

    • 每天如何按小时计算?
    【解决方案2】:

    为了更清楚一点,您不需要先创建一个名为“week_num”的新列。

    df.groupby(by=lambda x: "%d/%d" % (x.week(), x.year())).Category.value_counts()
    

    函数by会自动调用索引的每个时间戳对象,将它们转换为周和年,然后按周和年分组。

    【讨论】:

      【解决方案3】:

      将您的 TimeStamp 列转换为周数,然后按该周数和value_count 分类变量分组,如下所示:

      df.groupby('week_num').Category.value_counts()
      

      我假设从 TimeStamp 列创建了一个新列 week_num

      【讨论】:

      • 我有类似的任务,但是我想按分钟分组,如何实现?
      • 拥有一个带有日期列(日期时间类型)dates的DataFrame df,你可以使用df.groupby(df["dates"].dt.minute).size()。这会告诉您每分钟有多少行。
      猜你喜欢
      • 2018-07-24
      • 2017-05-28
      • 2014-02-05
      • 2017-08-11
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      相关资源
      最近更新 更多