我需要检查数据帧中类似列的联合唯一性。在文档中,我找到了这个代码片段,但它仅适用于DataFrameSchema。
import pandas as pd
import pandera as pa
schema = pa.DataFrameSchema(
columns={col: pa.Column(int) for col in ["a", "b", "c"]},
unique=["a", "c"],
report_duplicates = "exclude_first",
)
df = pd.DataFrame.from_records([
{"a": 1, "b": 2, "c": 3},
{"a": 1, "b": 2, "c": 3},
])
schema.validate(df)
null_schema = DataFrameSchema({
"column1": Column(float, Check(lambda x: x > 0), nullable=True)
})
print(null_schema.validate(df))
除了采用数据帧范围的模式检查之外,我应该如何为SchemaModel实现这一点?
是否有类似于此的字段级lambda检查的字段配置?
null_schema = DataFrameSchema({
"column1": Column(float, Check(lambda x: x > 0), nullable=True)
})
print(null_schema.validate(df))
我相信unique
关键字就是您想要的,但文档中的示例对于指出架构级别和列级别检查之间的区别并没有特别的帮助。
其次,对于这个用例,DataFrameSchema
可以与SchemaModel
互换。下面的示例将您的示例与SchemaModel
一起使用。
此检查将通过,因为您正在检查列a、b和c的联合唯一性。
class TestSchema(pa.SchemaModel):
a: pa.typing.Series[int]
c: pa.typing.Series[int]
c: pa.typing.Series[int]
class Config:
unique=["a","b","c"]
df = pd.DataFrame.from_records([
{"a": 1, "b": 99, "c": 3},
{"a": 2, "b": 99, "c": 2},
{"a": 2, "b": 0, "c": 2},
])
TestSchema.validate(df)
如果我们将unique
关键字更改为只包含a和c,则检查将失败,因为组合(2,2(出现两次。
class TestSchema(pa.SchemaModel):
a: pa.typing.Series[int]
c: pa.typing.Series[int]
c: pa.typing.Series[int]
class Config:
unique=["a","c"]
df = pd.DataFrame.from_records([
{"a": 1, "b": 99, "c": 3},
{"a": 2, "b": 99, "c": 2},
{"a": 2, "b": 0, "c": 2},
])
TestSchema.validate(df)