2017-01-11 6 views
-3

私たちは、1MのWindowsイベントログを保持するDataframeを持っています。パンダデータフレーム内のデータを急速にgrepする最も重要な方法は何ですか?

dataという列の1つを使用して、イベントログごとに取得する関連情報を保存します。たとえば:

SubjectUserName=myuser, SubjectDomainName=XX, TargetUserName=XXXXX, TargetDomainName=XXXXX

正規表現を使用してSubjectUserNameのリスト全体をダウンロードして、配列に結果を格納するデータフレームの列dataを反復処理するための最速の方法は何ですか?

iterrows()などの従来の反復方法を試しましたが、そのような大量のデータを処理する場合はかなり遅くなりました。

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

親切にも、Alexander。

+1

実際のデータのサンプルを提供する方がよいでしょう。あるいは、テストデータフレームを作成して私が提案する可能性のあるソリューションを試すことができるような代表者。 – piRSquared

+0

'SubjectUserName'などが関連する詳細である場合、それらを1つの列にまとめて格納するのではなく、別々の列(および/またはインデックス)にエントリとして格納します。あなたのデータ構造はあなたが使いたいもののために設計されていないようです。 –

答えて

1

IIUCを使用できstr.extract

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

#temporaly display with of one column to 100 
with pd.option_context('display.max_colwidth', 100): 
    print (df.data) 
0 SubjectUserName=myuser, SubjectDomainName=XX, TargetUserName=XXXXX, TargetDomainName=XXXXX 
1 SubjectUserName=myuser, SubjectDomainName=XX, TargetUserName=XXXXX, TargetDomainName=XXXXX 
Name: data, dtype: object 


print (df.data.str.extract('SubjectUserName=(.*), SubjectDomainName', expand=False)) 
     0 
0 myuser 
1 myuser 

別の可能な解決策は、4列に,(デフォルトの区切り)でread_csvと分割データを使用して、replaceです:その真、

import pandas as pd 
import numpy as np 
from pandas.compat import StringIO 

temp=u"""SubjectUserName=myuser, SubjectDomainName=XX, TargetUserName=XXXXX, TargetDomainName=XXXXX 
SubjectUserName=myuser, SubjectDomainName=XX, TargetUserName=XXXXX, TargetDomainName=XXXXX 
""" 
#after testing replace 'StringIO(temp)' to 'filename.csv' 
df = pd.read_csv(StringIO(temp), skipinitialspace=True, names=['SubjectUserName','SubjectDomainName','TargetUserName','TargetDomainName']) 
print (df) 
      SubjectUserName  SubjectDomainName  TargetUserName \ 
0 SubjectUserName=myuser SubjectDomainName=XX TargetUserName=XXXXX 
1 SubjectUserName=myuser SubjectDomainName=XX TargetUserName=XXXXX 

     TargetDomainName 
0 TargetDomainName=XXXXX 
1 TargetDomainName=XXXXX 


print (df.SubjectUserName.str.replace('SubjectUserName=', '')) 
0 myuser 
1 myuser 
Name: SubjectUserName, dtype: object 
+0

そのIIUCは何ですか? – MYGz

+0

Lol。あなたはそれを作ったのですか?または他の人も使用しますか? – MYGz

+2

いいえ、https://en.wiktionary.org/wiki/IIUC – jezrael

0

ファースト大規模なデータセットの場合、パンダは処理に多くの時間を必要とし、私も同じフェーズを経験しました。私は本当に助けてくれた小さなおもしろさをお伝えすることができます。

まず、データフレームにデータをロードさせます。次に列の別のリストを作成し、必要なすべての列を選択し、データフレームから独自のデータセット(Ex-xlsまたは.csvまたは.jsonファイル)を作成します。作成したデータセットのサイズは、作業していた元のデータセットよりもはるかに小さいことがわかります。オリジナルのデータセットには未使用の情報やコンテンツが多くあり、必要以上に多くのメモリを消費します。私は理解しています、これは標準的な方法ではありませんが、本当に私を助けました。例については :

df.to_csv('df1.csv') 

あなたはまた、あなたの選択した列を即興で、より小さなデータセットのためのより良い選択を行うことができます。例:

new_cols = ['Name', 'a', 'b', 'c', 'd', 'e'] 
df.columns = new_cols 

これは本当に助けになりました。それがあなたにも役立つことを願っています。

関連する問題