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

问题描述 投票:2回答:1

我正在处理大型数据集(> 100.000,> 100)。原始格式为CSV。我使用DataFrame库将文件读作pandas

所有数据都必须是数字类型(浮点数的整数),但通常会发生原始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

`

使用虚拟数据帧,我创建一个包含原始数据帧的布尔语句的掩码数据帧。在掩模中,所有数值(intfloat)都给出了True和所有非数值数据,如False

df_mask = df.applymap(lambda x: isinstance(x, (int, float)))

现在,在定位非数字数据的过程中,我遇到了问题。我最好的尝试如下,但它没有提供我False点的位置。

df_cols = col for col if df_mask.loc[False].any()

什么方法可以获取屏蔽数据帧(False)的df_mask位置?

或者甚至有更快的方法来跟踪DataFrame中的错误数据点?

python csv pandas dataframe
1个回答
2
投票

我想你可以先用Series创建unstack,然后用mask创建apply,然后用boolean indexing创建最后一个过滤器。

对于索引的值是必要的添加remove_unused_levels

df = df.unstack()
df_mask = df.apply(lambda x: isinstance(x, (int, float)))

print (df[~df_mask])
B  2    #
D  4    0
dtype: object

print (df.index[~df_mask].remove_unused_levels().tolist())
[('B', 2), ('D', 4)]

编辑:

如果想要提取非数值,那么使用to_numericerrors='coerce'将值转换为NaNs,然后检查它们:

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)]
© www.soinside.com 2019 - 2024. All rights reserved.