我目前正在使用Bat(https://github.com/Kitware/bat)读取Bro(https://www.bro.org/)日志文件并将其转换为Pandas数据帧。
我正在研究的一件事是DNS查询的频率分析。此输出显示了来自我的一个主机的一小时Bro dns数据的大小,因此您可能会了解我正在使用的数据量。
bro_df.info()
<class 'bat.log_to_dataframe.LogToDataFrame'>
DatetimeIndex: 1013219 entries, 2018-01-03 08:59:53.250328 to 2018-01-03 09:59:51.672011
Data columns (total 23 columns):
AA 1013219 non-null bool
RA 1013219 non-null bool
RD 1013219 non-null bool
TC 1013219 non-null bool
TTLs 1013219 non-null object
Z 1013219 non-null int64
answers 1013219 non-null object
id.orig_h 1013219 non-null object
id.orig_p 1013219 non-null int64
id.resp_h 1013219 non-null object
id.resp_p 1013219 non-null int64
proto 1013219 non-null object
qclass 1013219 non-null int64
qclass_name 1013219 non-null object
qtype 1013219 non-null int64
qtype_name 1013219 non-null object
query 1013219 non-null object
rcode 1013219 non-null int64
rcode_name 1013219 non-null object
rejected 1013219 non-null bool
rtt 1013219 non-null timedelta64[ns]
trans_id 1013219 non-null int64
uid 1013219 non-null object
dtypes: bool(5), int64(7), object(10), timedelta64[ns](1)
memory usage: 151.7+ MB
我做了一些快速简单的事情,例如删除不必要的列等等,但这仍然是一个非常大的数据帧。
为了对查找进行适当的频率分析,我还尝试从数据框中删除“已知好的”或“列入白名单的域”,这就是真正< / em>慢。因为我对熊猫很新,所以我担心我可能会以不太理想的方式做这件事,礼貌地说出来。
我删除白名单的方法如下:我删除了一些内部DNS信息以保护无辜者:
whitelist = ['-', '(empty)', 'in-addr.arpa', '.google.com', '.akamai.net',
'.akamaiedge.net', '.apple.com', '.contoso.msft']
for idx, row in bro_df.iterrows():
for item in whitelist:
if row['query'].endswith(item):
bro_df.drop(idx, inplace=True)
即使我将数据清理到比上面原始的bro_df.info()输出显示的数据要少得多,也需要很长时间才能运行。这一个日志文件反映了一小时内捕获的DNS查询,但删除列入白名单的内容需要花费的时间超过一小时,因此我在这里打败了一场失败的战斗。
非常感谢任何协助。
干杯,迈克
答案 0 :(得分:1)
我认为您需要str.contains
,因为匹配字符串末尾使用$
并按boolean indexing
过滤:
df = pd.DataFrame({'query':['-','dsds -','- sdsd']})
print (df)
query
0 -
1 dsds -
2 - sdsd
#() are escaped for remove warning
whitelist = ['-', '\(empty\)', 'in-addr.arpa', '.google.com', '.akamai.net',
'.akamaiedge.net', '.apple.com', '.contoso.msft']
pat = '|'.join([x + '$' for x in whitelist])
df = df[~df['query'].str.contains(pat)]
print (df)
query
2 - sdsd