有没有更快的方法来迭代和删除Pandas数据帧中的特定行?

时间:2018-01-03 14:15:58

标签: python pandas loops dataframe jupyter-notebook

我目前正在使用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查询,但删除列入白名单的内容需要花费的时间超过一小时,因此我在这里打败了一场失败的战斗。

非常感谢任何协助。

干杯,迈克

1 个答案:

答案 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