【问题标题】:Pandas DataFrame.groupby including indexPandas DataFrame.groupby 包括索引
【发布时间】:2015-12-01 15:20:13
【问题描述】:

我有一个来自 Windows 事件日志的数据集。 TimeGenerated 列设置为索引。我想通过EventType (info/warn/err) 和索引值获得一个汇总视图,向我显示事件的数量。我可以使用resample() 来设置日期时间分辨率(天、工作日等)。

这是我的数据框:

log.info()

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 80372 entries, 2015-08-31 12:15:23 to 2015-05-11 04:08:07
Data columns (total 4 columns):
EventID          80372 non-null int64
SourceName       80372 non-null object
EventType        76878 non-null object
EventCategory    80372 non-null int64
dtypes: int64(2), object(2)
memory usage: 3.1+ MB

我当然可以按 EventType 分组,但这会降低我的索引:

log[['EventID', 'EventType']].groupby('EventType').count('EventID')

我必须在对groupby() 的调用中指定我现有的索引,但是如何引用该索引?或者我必须在groupby() 调用之前执行reset_index() 吗?还是我只是把这一切都搞错了,我是熊猫新手是否很明显? ;-)

版本信息:

  • Python 3.4.2
  • 熊猫 0.16.2
  • numpy 1.9.2

更新

为了进一步澄清,我想要实现的是:

  • EventID 计数(事件数)
  • 按 EventType(在轴 1 中)
  • 按时间戳(在轴 0 中)

请注意,时间戳不是唯一的(在原始 DF 中),因为多个事件可以同时发生。

我能够实现我想要的一种方法是:

temp = log.reset_index()
temp.groupby(['TimeGenerated','EventType']).count('EventID'['EventID'].unstack().fillna(0)

在这种情况下,我的输出是:

这允许我进一步重新采样计数,例如:

temp.resample('MS', how='sum')

这可行,但我不知道是否必须执行reset_index() 才能实现此分组。我能否以更好(阅读:更有效)的方式完成它?

【问题讨论】:

  • “按索引值”是什么意思?每个事件都是一个时间戳,因此您的原始 DF 已经是索引值。例如,您是否要在 DF 中为 year_month 添加一列,然后将其包含在您的分组中?
  • 您可以使用pd.get_dummies(df.eventtype) 创建假人。然后只需按日期分组并对您添加的那些新列求和。
  • @BrianPendleton 非常真实!但是(尽管我意识到这不是原始问题的一部分)如果我想添加另一列(例如,按事件类型和主机名,按时间戳获取事件计数),这种方法仍然有效吗?
  • 如果我必须进行这种聚合工作,我通常会将我需要分组的所有变量作为索引。然后只需使用 group by 方法的level 参数即可。或者您可以在开始时重置索引,然后对列进行分组,而不用担心索引。

标签: python python-3.x pandas


【解决方案1】:

我缺少的是您可以在索引的一个或多个级别上执行groupby()

test = log.set_index('EventType', append=True)
test = test.groupby(level=[0,1])['EventID'].count('EventID')
test.unstack().fillna(0)

另外,Brian Pendleton 的建议也很有效:

pd.get_dummies(log.EventType)

最后一种方法的不同之处在于,如果您需要在列轴中添加另一个级别(例如,通过主机名),它就无法正常工作。但这当然不是最初问题的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2018-10-25
    • 1970-01-01
    • 2013-06-01
    相关资源
    最近更新 更多