Pandas DataFrame.groupby包括索引

时间:2015-09-05 16:44:16

标签: python python-3.x pandas

我有一个从Windows Eventlog中获取的数据集。 TimeGenerated列设置为索引。我想得到一个聚合视图,通过EventType(info / warn / err)和索引值显示事件数。我可以使用resample()来设置日期时间分辨率(日,工作日等)。

这是我的DataFrame:

DataFrame

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

Grouped

我必须在groupby()的调用中指定我现有的索引,但是如何引用索引呢?或者我必须在reset_index()来电之前执行groupby()吗?或者我只是简单地说这一切都是错的,我是熊猫新手是不是很明显? ; - )

版本信息:

  • Python 3.4.2
  • pandas 0.16.2
  • numpy 1.9.2

更新

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

  • EventIDs的数量(事件数量)
  • 按EventType(在第1轴中)
  • 按时间戳(在轴0中)

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

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

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

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

Grouped 2

然后允许我进一步重新计数,例如:

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

这是有效的,但我不知道是否必须执行reset_index()才能实现此分组。我可以用更好的方式(阅读:更有效率)来做到这一点吗?

1 个答案:

答案 0 :(得分:3)

我缺少的是您可以在索引的一个或多个级别上执行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)

与最后一种方法的不同之处在于,如果您需要在列轴中添加另一个级别(例如,通过主机名),它也不会起作用。但这当然不是原始问题的一部分。