2017-01-16 1 views
0

私はPandaのデータフレームに数百万のイベントログを保存しています。 dataという1つの列に、イベントログの詳細が格納されます。Pandas extractall()の使用方法は?

SubjectUserName=XXXX, SubjectDomainName=XX, TargetUserName=XXXX, TargetDomainName=XX.LOCAL, TargetServerName=XXXX.xx.local, TargetInfo=exchangeMDB/XXXX.xx.local, ProcessName=C:\Windows\System32\rundll32.exe 

私がキャプチャされたイベントに応じて、異なるkey=valueペアを持っている数百万行を持っています。ここでは一例です。

私が行ったのは、すべてのキーを抽出し、各キーがデータセット全体で何回見られたかを数えることです。たとえば:AssertionError: 1 columns passed, passed data had 25 columns:私は次のエラーを取得しています

events = eventlogs() 
items = events['data'].str.findall('([^ =]+)=') 
items = items.value_counts() 
return items 

item, count 
SubjectUserName, 1000 
TargetServerName, 2000 
... 

私のコードは次のようになります。

この場合、extractall()や別のメソッドを使用する適切な方法は何ですか?

ありがとうございました!

  • アレクサンダー。

答えて

1

私はあなたが1列dfため,to_frameによってstacksplitを使用して、=によって分割することができると思います。最終value_counts

print (df) 
               data 
0 SubjectUserName=XXXX, SubjectDomainName=XX, Ta... 
1 SubjectUserName=XXXX, SubjectDomainName=XX, Ta... 

df = df.data.str.split(', ', expand=True).stack().to_frame('data') 
splitted = df.data.str.split('=', expand=True) 
splitted.columns = ['key','val'] 
print (splitted) 
        key        val 
0 0 SubjectUserName        XXXX 
    1 SubjectDomainName        XX 
    2  TargetUserName        XXXX 
    3 TargetDomainName       XX.LOCAL 
    4 TargetServerName      XXXX.xx.local 
    5   TargetInfo   exchangeMDB/XXXX.xx.local 
    6  ProcessName C:\Windows\System32\rundll32.exe 
1 0 SubjectUserName        XXXX 
    1 SubjectDomainName        XX 
    2  TargetUserName        XXXX 
    3 TargetDomainName       XX.LOCAL 
    4 TargetServerName      XXXX.xx.local 
    5   TargetInfo   exchangeMDB/XXXX.xx.local 
    6  ProcessName C:\Windows\System32\rundll32.exe 

items = splitted.key.value_counts().reset_index() 
items.columns = ['item','count'] 
print (items) 
       item count 
0 SubjectUserName  2 
1 TargetServerName  2 
2  ProcessName  2 
3 TargetDomainName  2 
4 SubjectDomainName  2 
5  TargetUserName  2 
6   TargetInfo  2 

DataFrameコンストラクタとlist comprehensiondata欄の無NaN値であれば別の高速化ソリューション:

df = pd.DataFrame([ x.split(', ') for x in df['data'].values.tolist()]) 
     .stack() 
     .to_frame('data') 
print (df) 
              data 
0 0       SubjectUserName=XXXX 
    1       SubjectDomainName=XX 
    2       TargetUserName=XXXX 
    3      TargetDomainName=XX.LOCAL 
    4    TargetServerName=XXXX.xx.local 
    5   TargetInfo=exchangeMDB/XXXX.xx.local 
    6 ProcessName=C:\Windows\System32\rundll32.exe 
1 0       SubjectUserName=XXXX 
    1       SubjectDomainName=XX 
    2       TargetUserName=XXXX 
    3      TargetDomainName=XX.LOCAL 
    4    TargetServerName=XXXX.xx.local 
    5   TargetInfo=exchangeMDB/XXXX.xx.local 
    6 ProcessName=C:\Windows\System32\rundll32.exe 

splitted = pd.DataFrame([ x.split('=') for x in df['data'].values.tolist()]) 
splitted.columns = ['key','val'] 

items = splitted.key.value_counts().reset_index() 
items.columns = ['item','count'] 
print (items) 
       item count 
0 SubjectUserName  2 
1 TargetServerName  2 
2  ProcessName  2 
3 TargetDomainName  2 
4 SubjectDomainName  2 
5  TargetUserName  2 
6   TargetInfo  2 
関連する問題