我正在尝试使用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_cases
df并不总是有索引,比如列的类型不正确。该索引仅适用于生成与索引对齐的布尔数据帧/序列的检查。
默认情况下,输入到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
完成之前发生的错误(例如str
le
检查得到的TypeError("operator not supported...
(。