在dataframe python中查找错误的数据点

在dataframe python中查找错误的数据点,python,csv,pandas,dataframe,Python,Csv,Pandas,Dataframe,我正在处理大型数据集(>100.000,>100)。原始格式是CSV。我使用pandas库以DataFrame的形式读取文件 所有数据必须为数字类型(浮点整数),但在原始CSV文件中经常出现缺少数据点或错误字符串的情况。扫描整个CSV需要很多时间,如果可以找到点的话。因此,我试图生成一个函数或类,用它可以定位错误。并提供它们的列和行名称和/或编号,以便快速跟踪它们 为了试验和构造正确的算法,我使用了一个小的虚拟数据帧,其中包含一些样本错误数据点。定位点的期望结果将是,例如:['B',2],'D'

我正在处理大型数据集(>100.000,>100)。原始格式是CSV。我使用
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)]