我们有一个可容纳超过1M Windows事件日志的Dataframe。
其中一列名为data
,用于存储我们要为每个事件日志捕获的相关详细信息。例如:
SubjectUserName=myuser, SubjectDomainName=XX, TargetUserName=XXXXX, TargetDomainName=XXXXX
迭代数据框的列data
以使用正则表达式下载整个SubjectUserName
列表并将结果存储在数组中的最快方法是什么?
我们尝试过传统的迭代方法,例如iterrows()
,但在处理如此大量的数据时,这些方法证明相当慢。
提前感谢您的协助。
亲切的问候,亚历山大。
答案 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
这对我很有帮助。我希望它也可能对你有所帮助。