我正在处理大型数据集(> 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
`
使用虚拟数据帧,我创建一个包含原始数据帧的布尔语句的掩码数据帧。在掩模中,所有数值(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()
什么方法可以获取屏蔽数据帧(False
)的df_mask
位置?
或者甚至有更快的方法来跟踪DataFrame
中的错误数据点?
我想你可以先用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_numeric
和errors='coerce'
将值转换为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)]