python - 在数据框中找到错误的数据点python

标签 python csv pandas dataframe

我正在处理大型数据集(> 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

`

使用虚拟数据帧,我创建了一个掩码数据帧,其中包含原始数据帧的 bool 语句。在掩码中,所有数值(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()

如何获取屏蔽数据帧 (df_mask) 的 False 位置?

或者是否有一种更快的方法来跟踪DataFrame中的错误数据点?

最佳答案

我认为您可以先通过 unstack 创建系列 ,然后使用 apply 创建 mask 并按 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_numeric使用 errors='coerce' 将值转换为 NaN,然后检查它们:

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)]

关于python - 在数据框中找到错误的数据点python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44528751/

相关文章:

python - 为什么在我的数据中调用转置会将行索引从多重索引切换为平面索引?

python - 是否有用于将文件夹中的多个图像读入单个数组的 python 函数

csv - d3js.csv.get() 的作用是什么?

python - 如何向包含特定值的行添加新列?

java - 合并两个具有不同标题的csv文件

python - 按位置切片 MultiIndex pandas DataFrame

python - Suds 性能 - client.factory.create() 需要超过 2 分钟

python - 如何在 Travis CI 上构建 MacOSX 可执行文件?

Python( flask /棉花糖)ValueError : too many values to unpack (expected 2)

pandas - 将 Pandas 或 Pyspark 数据帧从 Databricks 保存到 Azure Blob 存储