我正在处理大型数据集(> 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 语句。在掩码中,所有数值(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
位置?
或者是否有一种更快的方法来跟踪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/