在dataframe python中查找错误的数据点
我正在处理大型数据集(>100.000,>100)。原始格式是CSV。我使用在dataframe python中查找错误的数据点,python,csv,pandas,dataframe,Python,Csv,Pandas,Dataframe,我正在处理大型数据集(>100.000,>100)。原始格式是CSV。我使用pandas库以DataFrame的形式读取文件 所有数据必须为数字类型(浮点整数),但在原始CSV文件中经常出现缺少数据点或错误字符串的情况。扫描整个CSV需要很多时间,如果可以找到点的话。因此,我试图生成一个函数或类,用它可以定位错误。并提供它们的列和行名称和/或编号,以便快速跟踪它们 为了试验和构造正确的算法,我使用了一个小的虚拟数据帧,其中包含一些样本错误数据点。定位点的期望结果将是,例如:['B',2],'D'
pandas
库以DataFrame
的形式读取文件
所有数据必须为数字类型(浮点整数),但在原始CSV文件中经常出现缺少数据点或错误字符串的情况。扫描整个CSV需要很多时间,如果可以找到点的话。因此,我试图生成一个函数或类,用它可以定位错误。并提供它们的列和行名称和/或编号,以便快速跟踪它们
为了试验和构造正确的算法,我使用了一个小的虚拟数据帧,其中包含一些样本错误数据点。定位点的期望结果将是,例如:['B',2],'D',4],使用列和索引进行定位
# Import dependency
import pandas as pd
# Create dummy DataFrame for testing
df = pd.DataFrame({'A': [1, 1, 1, 1, 1],
'B': [1, 1, '#', 1, 1], # Undesired datapoint '#' to be located
'C': [1, 1, 1, 1, 1],
'D': [1, 1, 1, 1, '0']}) # Undesired datapoint '0' to be located
`
使用虚拟数据帧,我创建了一个包含原始数据帧的布尔语句的掩码数据帧。在掩码中,所有数值(int
和float
)被赋予True
,所有非数值数据被赋予False
df_mask = df.applymap(lambda x: isinstance(x, (int, float)))
现在在定位非数值数据的部分,我被卡住了。我的最佳尝试如下所示,但是它没有提供False
点的位置
df_cols = col for col if df_mask.loc[False].any()
获取屏蔽数据帧(df_mask
)的False
位置的方法是什么
或者有没有更快捷的方法来跟踪
数据帧中的错误数据点
我认为您可以先创建系列
,然后使用应用创建掩码
,最后使用筛选
对于索引值,必须添加:
编辑:
如果要提取非数值,请与errors='concurve'
一起使用,将值转换为NaN
s,然后检查它们:
df = pd.DataFrame({'A': [1, 1, 1, 1, 1],
'B': [1, 1, '#', 1, 1],
'C': [1, 1, 1, 1, 1],
'D': [1, 1, 1, 1, '0']}).astype(str)
print (df.applymap(type))
A B C D
0 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
1 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
2 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
3 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
4 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
df = df.unstack()
df_mask = pd.to_numeric(df, errors='coerce').isnull()
print (df[df_mask])
B 2 #
dtype: object
print (df.index[df_mask].remove_unused_levels().tolist())
[('B', 2)]
df=pd.DataFrame({'A':[1,1,1,1,1],
‘B’:[1,1,#,1,1],
‘C’:[1,1,1,1,1],
'D':[1,1,1,1,0']}.astype(str)
打印(df.applymap(类型))
A、B、C、D
0
1.
2.
3.
4.
df=df.unstack()
df_mask=pd.to_numeric(df,errors='concurve').isnull()
打印(df[df_掩码])
B 2#
数据类型:对象
打印(df.index[df\u mask]。删除未使用的\u级别().tolist())
[('B',2)]
非常感谢你,耶斯雷尔,这真的很有帮助!(很抱歉回答得太晚了。)但是,只有当我像问题中那样设置虚拟数据帧时,它才起作用。当我使用“pd.read_CSV”从CSV导入与数据帧相同的数据,然后使用unstack()并应用掩码时,对于整列中的所有值(其中一行具有非数值),它将返回False。你知道是什么导致了这种差异吗?
df = pd.DataFrame({'A': [1, 1, 1, 1, 1],
'B': [1, 1, '#', 1, 1],
'C': [1, 1, 1, 1, 1],
'D': [1, 1, 1, 1, '0']}).astype(str)
print (df.applymap(type))
A B C D
0 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
1 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
2 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
3 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
4 <class 'str'> <class 'str'> <class 'str'> <class 'str'>
df = df.unstack()
df_mask = pd.to_numeric(df, errors='coerce').isnull()
print (df[df_mask])
B 2 #
dtype: object
print (df.index[df_mask].remove_unused_levels().tolist())
[('B', 2)]