当只有一个错误时,远大期望期望列仅包含整数,所有行都会失败

Dan*_*Dan 6 python validation types pandas great-expectations

我想使用Great Expectations包来验证 .csv 文件中的列仅包含整数。

我正在使用的文件在年龄列中只有整数,除了一行具有“”字符之外。这就是我希望期望能够捕捉到的。我还在文本编辑器中检查了 .csv 文件,并可以确认年龄列中的年龄未用引号引起来。

然而,100% 的数据都未能达到预期。我认为这是因为 pandas 正在读取作为对象类型(因此是字符串)的列,因为有一个不正确的行。我可以使用类似的方法对其进行预处理,.astype(int)因为它会在该行上失败。而包裹.astype(int)在一个try块中将完全违背对此寄予厚望的目的。

这是一个最小的工作示例:

好.csv:

age,name
34,Fred
22,Bob
54,Mary
Run Code Online (Sandbox Code Playgroud)

坏.csv:

age,name
34,Fred
`,Bob
54,Mary
Run Code Online (Sandbox Code Playgroud)

代码:

import great_expectations as ge

df = ge.read_csv("./good.csv");
my_df.expect_column_values_to_be_of_type('age','int')

df = ge.read_csv("./bad.csv");
my_df.expect_column_values_to_be_of_type('age','int')
Run Code Online (Sandbox Code Playgroud)

第一个案例返回

{'success': True,
 'result': {'element_count': 3,
  'missing_count': 0,
  'missing_percent': 0.0,
  'unexpected_count': 0,
  'unexpected_percent': 0.0,
  'unexpected_percent_nonmissing': 0.0,
  'partial_unexpected_list': []}}
Run Code Online (Sandbox Code Playgroud)

所以所有的年龄都是整数,并且每一行都成功。我预计第二种情况会失败,但仅限于第二行。但是它在所有行上都失败:

{'success': False,
 'result': {'element_count': 3,
  'missing_count': 0,
  'missing_percent': 0.0,
  'unexpected_count': 3,
  'unexpected_percent': 1.0,
  'unexpected_percent_nonmissing': 1.0,
  'partial_unexpected_list': ['34', '`', '54']}}
Run Code Online (Sandbox Code Playgroud)

所以我想我期待这样的事情:

{'success': False,
 'result': {'element_count': 3,
  'missing_count': 0,
  'missing_percent': 0.0,
  'unexpected_count': 1,
  'unexpected_percent': 0.33,
  'unexpected_percent_nonmissing': 1.0,
  'partial_unexpected_list': ['`']}}
Run Code Online (Sandbox Code Playgroud)

是我做错了什么,还是这个包没有能力做到这一点?

Dan*_*Dan 1

作为实施新版本之前的解决方法expect_column_values_to_be_parseasble_as_type,我可以使用正则表达式期望来实现相同的结果:

my_df = ge.read_csv("bad.csv")
pattern = r'^\d+$'
result  = my_df.expect_column_values_to_match_regex('age',
                                                    pattern,
                                                    result_format={'result_format': 'COMPLETE'})

result
# In my case I'm only interested in where it went wrong
# print(result['result']['unexpected_list'])
# print(result['result']['unexpected_index_list'])
Run Code Online (Sandbox Code Playgroud)

这使:

{'success': False,
 'result': {'element_count': 3,
  'missing_count': 0,
  'missing_percent': 0.0,
  'unexpected_count': 1,
  'unexpected_percent': 0.3333333333333333,
  'unexpected_percent_nonmissing': 0.3333333333333333,
  'partial_unexpected_list': ['`'],
  'partial_unexpected_index_list': [1],
  'partial_unexpected_counts': [{'value': '`', 'count': 1}],
  'unexpected_list': ['`'],
  'unexpected_index_list': [1]}}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想允许前导 + 或 -,您需要将模式更改为:

pattern = r'^[+-]?\d+$'
Run Code Online (Sandbox Code Playgroud)