【问题标题】:Pandera validate get all valid rowsPandera validate 获取所有有效行
【发布时间】:2021-12-25 02:24:40
【问题描述】:

我正在尝试使用 pandera 库(我对此很陌生)进行 pandas 数据框验证。 我想要做的是忽略根据架构无效的行。 我该怎么做?

例如: pandera 架构如下所示:

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

删除了其他有错误的行。

【问题讨论】:

  • 我为这个问题创建并添加了 pandera 标签,所以@Prashant,请批准this suggested edit 将新标签应用于您的问题。

标签: python pandas data-science pandera


【解决方案1】:

pandera 作者在这里!

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

默认情况下,馈入pa.Checkcheck_fn 函数应采用熊猫系列作为输入。我修复了您的自定义检查,如下所示:

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 kwarg,它会修改 check_fn arg 的预期类型签名。

【讨论】:

    【解决方案2】:

    这是我第一次听说 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

    【讨论】:

    • 感谢您的回复。我已经尝试过了,但有两件事: 1. 一旦遇到第一个无效行,就会捕获 SchemaError 异常。 2. 验证中还有一个惰性模式,它在验证所有行后抛出pa.errors.SchemaErrors。但是 failure_cases 并不总是包含索引。有时是无。
    【解决方案3】:

    我有同样的问题,失败案例并不总是有索引 - 可能是一个错误(抱歉回复了答案,我没有声誉)。
    这是一个最小的复制:

    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.Checks 做了一些特殊的事情,这不会发生在数据类型不匹配错误或Check 完成之前发生的错误(例如TypeError("operator not supported... 你得到str le 检查)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-17
      • 2014-04-05
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 2016-08-26
      • 2015-09-09
      相关资源
      最近更新 更多