Pandera validate获取所有有效行



我正在尝试使用pandra库(我对此很陌生(进行panda数据帧验证。我想做的是忽略根据模式无效的行。我该怎么做?

例如:pandra模式如下:

import pandera as pa
import pandas as pd
schema: pa.DataFrameSchema = pa.DataFrameSchema(columns={
'Col1': pa.Column(str),
'Col2': pa.Column(float, checks=pa.Check(lambda x: (0 <= x <= 1)), nullable=True),
})
df: pd.DataFrame = pd.DataFrame({
"Col1": ["1", "2", "3", nan],
"Col2": [0.3, 0.4, 5, 0.2],
})

我想做的是,当我在df上应用验证时,我会得到一个结果:

Col1  Col2
0     1   0.3
1     2   0.4

已删除其他出现错误的行。

pandra作者在这里!

目前,您必须使用带有延迟验证的try except块。在某些情况下,SchemaErrors.failure_casesdf并不总是有索引,比如列的类型不正确。该索引仅适用于生成与索引对齐的布尔数据帧/序列的检查。

默认情况下,输入到pa.Check中的check_fn函数应采用pandas系列作为输入。我这样修复了你的自定义检查:

import pandera as pa
import pandas as pd
import numpy as np
schema: pa.DataFrameSchema = pa.DataFrameSchema(columns={
'Col1': pa.Column(str),
'Col2': pa.Column(
float, checks=pa.Check(lambda series: series.between(0, 1)), nullable=True
),
})
df: pd.DataFrame = pd.DataFrame({
"Col1": ["1", "2", "3", np.nan],
"Col2": [0.3, 0.4, 5, 0.2],
})
try:
schema(df, lazy=True)
except pa.errors.SchemaErrors as exc:
filtered_df = df[~df.index.isin(exc.failure_cases["index"])]
print(f"filtered df:n{filtered_df}")

输出:

filtered df:
Col1  Col2
0    1   0.3
1    2   0.4

要检查值范围,我建议使用内置的pa.Check.in_range检查。

在其他情况下,只需注意pa.Check中的element_wise=True参数,它会修改check_fn参数的预期类型签名。

这是我第一次听说Pandera,但它看起来很酷。经过一番挖掘,您可以发现验证错误并过滤掉失败索引:

fail_index = []
try:
schema.validate(df)
except pa.errors.SchemaError as ex:
fail_index = ex.failure_cases['index']
clean_df = df[~df.index.isin(fail_index)]

关于SchemaError的文档:https://pandera.readthedocs.io/en/stable/reference/generated/pandera.errors.SchemaError.html#pandera.errors.SchemaError

我也有同样的问题,failure_cases不总是有索引-这可能是一个错误(很抱歉回复,我没有信誉(
这是一个最小复制:

import pandas, pandera
df = pandas.DataFrame({"c1": ["9"]})
# other checks also fail, e.g.:
# pandera.Column(str, checks=pandera.Check.le(10))
schema = pandera.DataFrameSchema({"c1": pandera.Column(int)})
try:
schema.validate(df, lazy=True)
except pandera.errors.SchemaErrors as err:
print(err.failure_cases)

输出:

schema_context column           check check_number failure_case index
0         Column     c1  dtype('int64')         None       object  None

我希望这里的索引为0,而不是None。我怀疑pandera.Check会做一些特殊的事情,而这些事情不会发生在数据类型不匹配错误或Check完成之前发生的错误(例如strle检查得到的TypeError("operator not supported...(。

相关内容

  • 没有找到相关文章

最新更新