【问题标题】:Plot number of occurrences from Pandas DataFrame绘制 Pandas DataFrame 的出现次数
【发布时间】:2014-02-15 09:23:10
【问题描述】:

我有一个包含两列的 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

我想知道某天执行了多少特定类型的操作。 IE。对于每一天,我需要计算 actionX 的出现次数,并在 X 轴上绘制日期,在 Y 轴上绘制 actionX 的出现次数,每个日期。

当然,我可以通过遍历我的数据集来天真地计算每天的操作。但是使用 pandas/matplotlib 的“正确方法”是什么?

【问题讨论】:

    标签: python matplotlib pandas


    【解决方案1】:

    我发现组合 .count_values().plot.bar() 做直方图非常直观。它还为您按正确的顺序排列类别,并且在许多类别太多的情况下,您可以简单地使用.count_values().iloc[:k].plot.bar()

    因此,在您的情况下,我要做的是计算一个新的 Pandas 系列 date+action,格式化为可读性,然后调用上面的 sn-p 之一。代码可能如下所示:

    date_and_action = df['date'].astype(str).str.slice(0, 10) + '_' + df['action']
    date_and_action.count_values().iloc[:k].plot.bar()
    

    【讨论】:

      【解决方案2】:

      你可以通过使用来获得计数

      df.groupby([df.index.date, 'action']).count()
      

      也可以直接用这个方法画图

      df.groupby([df.index.date, 'action']).count().plot(kind='bar')
      

      您也可以将结果存储到count,然后单独绘制。这是假设您的索引已经是 datetimeindex 格式,否则按照上面@mkln 的指示。

      【讨论】:

      • 按顺序获取结果通常很有用,所以我将order() 添加到管道中
      【解决方案3】:

                      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'])
      

      【讨论】:

      • 感谢您的回答!我像这样更改了代码中的最后一行:counts = df.groupby([df.day.to_period('D'), 'col_name']).agg(len),因为我需要按天而不是按索引中的确切时间对数据进行分组。它工作并给了我多索引系列对象。但是我仍然无法绘制这些数据,因为我无法 unstack 他们。我在这里stackoverflow.com/questions/21352520/pandas-unstack-doesnt-work 就这个问题提出了单独的问题,似乎有一个错误。但是由于unstack 不起作用,也许还有另一种方法来绘制这些数据?谢谢
      猜你喜欢
      • 2015-11-17
      • 2017-03-27
      • 2017-11-09
      • 2018-07-05
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2020-07-08
      相关资源
      最近更新 更多