Pandas DataFrame.groupby包含索引

2024-05-19 12:52:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这是我的数据框:

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()?或者我是不是完全错了,很明显我是熊猫的新生?;-)

版本信息:

  • Python3.4.2
  • 熊猫0.16.2
  • 纽比1.9.2

更新

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

  • 事件ID的计数(事件数)
  • 按事件类型(在轴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()来实现这个分组。我能用更好的方法(读:更有效率)做这件事吗?


Tags: 数据logindexobject时间事件nulltemp
1条回答
网友
1楼 · 发布于 2024-05-19 12:52:49

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

与上一种方法的不同之处在于,如果需要在列轴中添加另一个级别(例如按主机名),那么它就不能很好地工作。但这当然不是最初问题的一部分。

相关问题 更多 >