2015-09-05 117 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) 

利用這最後的做法不同的是,如果你需要添加在你的專欄另一個層面它不工作,以及軸(例如通過主機名)。但這當然不是原始問題的一部分。