我最近一直在使用数据库进行网络安全攻击分类的独立项目。我使用 Pandas (Python) 导入了数据库,在开始处理步骤之前,我注意到一些条目包含以下符号:“-”、“0x000b”、“0xc0a8”以及许多其他难以跟踪的符号看看有多少这些未格式化的数据存在,特别是当数据库这么大的时候。有没有办法获取整个数据帧,发现所有可能的未格式化和错误数据并用 NaN 替换它们,以便稍后将它们视为缺失值?
提前致谢!
我最近一直在使用数据库进行网络安全攻击分类的独立项目。我使用 Pandas (Python) 导入了数据库,在开始处理步骤之前,我注意到一些条目包含以下符号:“-”、“0x000b”、“0xc0a8”以及许多其他难以跟踪的符号看看有多少这些未格式化的数据存在,特别是当数据库这么大的时候。有没有办法获取整个数据帧,发现所有可能的未格式化和错误数据并用 NaN 替换它们,以便稍后将它们视为缺失值?
提前致谢!
你说的那些符号就是hex价值观。它们实际上可能对保留在数据集中很有用,因为tcpdump如果设置了正确的选项,该工具会输出它们。
尽管如此,您可以使用pandas简单的正则表达式替换它们的出现。hex匹配值的正则表达式是: 0[xX][0-9a-fA-F]+-在这里查看现场演示。
我下载了其中一个 CSV 文件并这样做:
import pandas as pd
filename = "./UNSW-NB15_1.csv"
df = pd.read_csv(filename, nrows=5000) # read first 5000 lines
df.to_html("with_hex.html") # open in a browser to inspect (e.g. line 211)
现在使用 DataFramereplace并设置正则表达式标志,并插入任何您想用(此处"NaN")替换匹配项的内容。
clean = df.replace("0[xX][0-9a-fA-F]+", value="NaN", regex=True)
我用它在浏览器中快速查看数据的清理版本(注意第 211 行):
clean.to_html("clean.html")
您可以使用相同的技巧替换几乎任何内容,因此您的字段'-'可以替换为:
# "inplace" means it overwrites the values, no new dataframe is returned
clean.replace("-", "NaN", regex=False, inplace=True)
这些是十六进制数字,也就是 16 位数字。Python 中的十六进制数字表示为以“0x”开头的字符串。将它们保留为十六进制或将它们转换为以 10 为基数的整数:
int("0x000b", 16) #=> 11
int("0xc0a8", 16) #=> 49320