2015-09-05 121 views
1

我有一个数据集取自Windows Eventlog。 TimeGenerated列被设置为索引。我想得到一个聚合视图,显示事件的数量,由EventType(info/warn/err)和索引值组成。我可以使用resample()设置日期时间分辨率(日,工作日等)。熊猫DataFrame.groupby包括索引

这里是我的数据框:

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 

我可以通过事件类型课程群,但这种下降我的索引:

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

Grouped

我会在通话中指定我现有的索引到groupby(),但我怎样才能引用索引?或者我必须在拨打groupby()之前执行reset_index()?或者我只是简单地谈论这一切都是错误的,而且我是熊猫新手呢,这显然很明显吗? ;-)

版本信息:

  • 的Python 3.4.2
  • 大熊猫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()要实现这个分组。我能否以更好的方式做到这一点(阅读:更有效率)?

+0

你是什么意思'按指数值'?每个事件都是一个时间戳,所以你的原始DF已经是索引值。例如,您是否想在DF中添加一列,例如,然后将其包含在您的分组中? – Alexander

+1

您可以使用'pd.get_dummies(df.eventtype)'创建假人。然后只是按照您添加的新列添加日期和总和。 –

+0

@BrianPendleton非常真实!然而(尽管我意识到这不是原问题的一部分),如果我想添加另一列(例如按事件类型和主机名,按时间戳记计数事件),这种方法仍然有效吗? –

回答

3

我不知道的是,您可以在索引的一个或多个级别上执行groupby()

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

另外,由布赖恩·彭德尔顿的建议的工作,以及:

pd.get_dummies(log.EventType) 

利用这最后的做法不同的是,如果你需要添加在你的专栏另一个层面它不工作,以及轴(例如通过主机名)。但这当然不是原始问题的一部分。