在熊猫数据框中快速grep数据的最佳方法是什么?

时间:2017-01-11 06:04:07

标签: python pandas dataframe

我们有一个可容纳超过1M Windows事件日志的Dataframe。

其中一列名为data,用于存储我们要为每个事件日志捕获的相关详细信息。例如:

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

迭代数据框的列data以使用正则表达式下载整个SubjectUserName列表并将结果存储在数组中的最快方法是什么?

我们尝试过传统的迭代方法,例如iterrows(),但在处理如此大量的数据时,这些方法证明相当慢。

提前感谢您的协助。

亲切的问候,亚历山大。

2 个答案:

答案 0 :(得分: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

另一种可能的解决方案是使用read_csv并按,(默认分隔符)将数据拆分为4列,然后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

答案 1 :(得分:0)

首先,对大型数据集而言,大熊猫需要花费大量时间来处理,而且我也经历了相同的阶段。我可以建议你一个真正帮助我的小技巧。

首先,让数据在数据帧上加载一次。然后创建另一个列列表,选择所需的所有列,并从数据框中创建自己的数据集(例如.xls或.csv或.json文件)。您会发现创建的数据集的大小远小于您使用的原始数据集。原始数据集具有许多未使用的信息和内容,这些信息和内容从未使用过,并且占用的内我明白,这不是标准方式,但它确实帮助了我。 例如:

df.to_csv('df1.csv')

您还可以即兴创作所选列,并为较小的数据集做出更好的选择。例如:

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

这对我很有帮助。我希望它也可能对你有所帮助。