未格式化的数据条目

数据挖掘 Python 数据挖掘 熊猫 数据清理 数据框
2021-09-23 09:26:05

我最近一直在使用数据库进行网络安全攻击分类的独立项目。我使用 Pandas (Python) 导入了数据库,在开始处理步骤之前,我注意到一些条目包含以下符号:“-”、“0x000b”、“0xc0a8”以及许多其他难以跟踪的符号看看有多少这些未格式化的数据存在,特别是当数据库这么大的时候。有没有办法获取整个数据帧,发现所有可能的未格式化和错误数据并用 NaN 替换它们,以便稍后将它们视为缺失值?

提前致谢!

2个回答

你说的那些符号就是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