python Pandera检查多个列

esbemjvw  于 6个月前  发布在  Python
关注(0)|答案(2)|浏览(63)

我正在写一个Python脚本来使用Pandera库验证Pandas DataFrame中的列。我的问题是,我可以一次验证一列,但我无法找到如何在考虑到Pandas DataFrame中另一列的值的情况下验证一列中的值。
具体来说,我想检查一列中是否存在值,如果存在,我还想检查该行的另一列中的值是否也包含某些文本。

import numpy as np
import pandas as pd
import pandera as pa

dataframe = pd.DataFrame({'column_A': ['ABC company', 'BBB company', 'ABC company', 'CCC company'],
                          'column_B': ['1000', np.NaN, '2000', np.NaN]
                          })

schema = pa.DataFrameSchema(
    columns={
        'column_A': pa.Column(pa.String),
        'column_B': pa.Column(pa.String, nullable=True,
                              checks=pa.Check(
                                  lambda df: (df['column_A'].str.contains('ABC')) & (~df['column_B'].isna())))
    }
)

schema.validate(dataframe)

字符串
这是我试图解决的问题,但Pandera没有意识到我想在列B的验证过程中检查多个系列。

qnakjoqk

qnakjoqk1#

如果你想在框架级别进行检查(在文档中查找 # define a wide DataFrame-level check),你需要在列之外进行测试:

import numpy as np
import pandas as pd
import pandera as pa

dataframe = pd.DataFrame({'column_A': ['ABC company', 'BBB company', 'ABC company', 'CCC company'],
                          'column_B': ['1000', np.NaN, '2000', np.NaN]
                          })

# define your dataframe level test
check_AB = pa.Check(
    lambda df: (df['column_A'].str.contains('ABC')) & (~df['column_B'].isna()),
    name='check_AB'
)

schema = pa.DataFrameSchema(
    columns={
        'column_A': pa.Column(pa.String),
        'column_B': pa.Column(pa.String, nullable=True)
    },
    checks=check_AB  # <- dataframe wide check
)

字符串
输出量:

>>> schema.validate(dataframe)
...
<Check check_AB>
failure cases:
     column  index failure_case
0  column_A      1  BBB company
1  column_A      3  CCC company

prdp8dxp

prdp8dxp2#

IIUC,您需要调整布尔掩码并隔离检查以避免KeyError

schema = pa.DataFrameSchema(
    columns={
        "column_A": pa.Column(pa.String),
        "column_B": pa.Column(pa.String, nullable=True),
    },
    checks=[
        pa.Check(
          lambda df: (
              df["column_A"].str.contains("ABC")
              & (b_notna:=df["column_B"].notna())
          ).where(b_notna, True), ignore_na=False
        )
    ]
)

字符串
输出量:

print(schema.validate(dataframe))

      column_A column_B
0  ABC company     1000
1  BBB company      NaN
2  ABC company     2000
3  CCC company      NaN


现在,如果我们将column_A的第一个值设置为"A_BC",则检查失败:

# failure cases:

#      column  index  failure_case
# 0  column_A      0  A_BC company
# 1  column_B      0          1000

相关问题