python - 列组合的 Pandas 数据框模式验证

标签 python pandas

我正在使用 pandera 开发 Pandas DataFrame Schema 验证代码(在 python 中),并且正在寻找最佳方法来验证 DataFrame 是否具有列组合的唯一值。

原始数据由他人提供,格式为CSV。我的代码将 CSV 加载到 Pandas DataFrame 中,然后执行 pandera DataFrameSchema 验证 Dataframe 具有使用 X 和 Y 坐标的地理坐标系列。 数据的性质是数据集中的每一行都应具有唯一的 X、Y 坐标。

csv 文件具有一般格式:
x_coord, y_coord, value_A, value_B
12.1234、23.2345、27.23、32.84
34.3456、45.4567、21.12、22.32
....
....

使用 pandera ,我能想到的唯一方法是:

采取多步骤方法:

  1. 将 csv 文件加载到 pandas DataFrame 中。
  2. 创建一个 pandas 单列 DataFrame,其中列名称是(比方说)'coords',值是从 csv DataFrame 坐标列的字符串组合生成的。
  3. 使用带有 allow_duplicates=False 的 pandera 列检查该列中的唯一性的 pandera DataFrameSchema 验证 coords DataFrame。
  4. 使用自己的 pandera 模式验证 csv DataFrame
  5. 合并来自两个模式验证的模式错误并将其作为错误提出。

该方法似乎有点笨拙,我正在寻找其他可以更好地利用 pandera 灵 active 的选项。

实现上面的代码是:

import pandas as pd
import pandera as pa

def get_valid_coord_df(filename):
  df = pd.read_csv(filename)

  schema = DataFrameSchema(columns={
        'x_coord': pa.Column(pa.Float,
                              Check.in_range(0, 100_000)),
        'y_coord': pa.Column(pa.Float,
                              Check.in_range(0, 100_000)),
        'value_A': pa.Column(pa.Float,
                              Check.in_range(0, 20)),
        'value_B': pa.Column(pa.Float,
                              Check.in_range(0, 20))
        },
        strict=True, ordered=True)

  schema.validate(df, lazy=True) #will raise SchemaError

  df_coord = pd.DataFrame(df['x_coord'].astype(str) + ',' + df['x_coord'].astype(str))

  schema_coord = DataFrameSchema(columns={
       'x_coord': pa.Column(pa.String,
                            allow_duplicates=False)})

  schema_coord.validate(df_coord, lazy=True) #will raise SchemaError

  return df

         
 

最佳答案

在这里你可以使用wide checksCheck 函数 arg 中访问整个数据框:

import pandera as pa

schema = pa.DataFrameSchema(
    columns={
        "x_coord": pa.Column(pa.Float, pa.Check.in_range(0, 100_000)),
        "y_coord": pa.Column(pa.Float, pa.Check.in_range(0, 100_000)),
        "value_A": pa.Column(pa.Float, pa.Check.in_range(0, 20)),
        "value_B": pa.Column(pa.Float, pa.Check.in_range(0, 20)),
    },
    # checks at the DataFrameSchema level take the dataframe as input
    # (as opposed to the series at the Column level)
    checks=pa.Check(lambda df: ~df[["x_coord", "y_coord"]].duplicated()),
    strict=True,
    ordered=True,
)

如果您发现自己在代码库中更频繁地使用此检查,您还可以定义一个 check extension这样您就可以在 pa.Check 命名空间中访问它:

import pandera.extensions as extensions

@extensions.register_check_method(
    statistics=["columns"], supported_types=pd.DataFrame,
)
def unique_columns(pandas_obj, *, columns):
    return ~pandas_obj[columns].duplicated()


schema = pa.DataFrameSchema(
    checks=pa.Check.unique_columns(["x_coord", "y_coord"])
)

schema.validate(
    pd.DataFrame(
        {
            "x_coord": [1.0, 2.0, 3.0],
            "y_coord": [4.0, 5.0, 6.0],
        }
    )
)

关于python - 列组合的 Pandas 数据框模式验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65714703/

相关文章:

python - 检查Python DataFrame中是否有任何值为0

python - 应用 Pandas 创建列方法和函数

python - 如何在 python 中为 chrome 的 webdriver 设置代理

Python itertools : Cartesian product with filtering of empty strings

python - Colaboratory - 记住 Google Drive Auth(Python)

javascript - 服务器端或 Javascript 计算?

python - 如何让 create 语句尊重自定义 Django 字段中的 "from_db_value"?

python - 向 Bokeh 图添加标签

python - 数据框如何按字母顺序将值从 a 排序到 b 而不是 aa

python - 对数据帧的每一行应用函数并同时递增计数器