Как использовать Pandera для проверки наличия подстрок из одного столбца в другом?

Вопрос или проблема

У меня есть схема DataFrameSchema, подобная этой:

Schema = DataFrameSchema(
   columns={
        'Complete_Name': Column(name="Complete_Name", dtype="string", nullable=True),
        'Surname': Column(name="Surname", dtype="string", nullable=True),
    }, 
   checks=check_cross_check_name_and_surname, 
   coerce=True, 
   strict=True, 
   ordered=False, 
   unique_column_names=True, 
   metadata=None
)

Проверка должна работать как этот SQL-запрос (Каждое полное имя должно иметь соответствующую фамилию):

SELECT * FROM database.user 
WHERE Complete_Name LIKE '%'||Surname||'%'

Я пробовал такие варианты:

check_cross_check_name_and_surname = [pa.Check(lambda df: df["Complete_Name"].str.contains(df["Surname"], regex=True), element_wise=True, ignore_na=False)]

check_cross_check_name_and_surname = [pa.Check(lambda df: df["Complete_Name"].str.contains(df["Surname"], regex=False), element_wise=True, ignore_na=False)]

check_cross_check_name_and_surname = [pa.Check(lambda df: df["Surname"] in df["Complete_Name"], element_wise=True, ignore_na=False)] 

Что мне нужно написать, чтобы убедиться, что мои тесты работают правильно, когда я вызываю Schema.validate(dataframe)?

Ответ или решение

Для того чтобы использовать Pandera для проверки наличия подстрок из одного столбца в другом столбце вашего DataFrame, можно определить собственную проверку, используя Check в Pandera. Мы создадим проверку для столбца 'Complete_Name', чтобы проверить, существует ли в нём подстрока из столбца 'Surname'.

Вот подробное решение вашей задачи:

  1. Импортируйте необходимые библиотеки.
  2. Определите схему DataFrame с вашей проверкой.
  3. Напишите логику проверки, которая будет использовать метод str.contains с параметром regex, чтобы обработать каждую строку.

Вот пример кода:

import pandas as pd
import pandera as pa
from pandera import Column, DataFrameSchema, Check

# Пример данных
data = {
    'Complete_Name': ['Иван Иванов', 'Петр Петров', 'Сидор Сидоров'],
    'Surname': ['Иванов', 'Петров', 'Сидоров']
}
df = pd.DataFrame(data)

# Проверка, чтобы удостовериться, что каждая фамилия содержится в полном имени
def check_cross_check_name_and_surname(df: pd.DataFrame) -> pd.Series:
    return df.apply(lambda row: row['Surname'] in row['Complete_Name'], axis=1)

# Определение схемы DataFrame с проверкой
Schema = DataFrameSchema(
    columns={
        'Complete_Name': Column(name="Complete_Name", dtype="string", nullable=True),
        'Surname': Column(name="Surname", dtype="string", nullable=True),
    },
    checks=Check(check_cross_check_name_and_surname, element_wise=True, ignore_na=False),
    coerce=True,
    strict=True,
    ordered=False,
    unique_column_names=True
)

# Проверка данных
try:
    Schema.validate(df)
    print("Данные корректны!")
except pa.errors.SchemaError as e:
    print("Ошибка в данных:")
    print(e)

Пояснения к коду:

  1. Импорт библиотек: Мы импортируем необходимые библиотеки для работы с данными и схемами.
  2. Пример данных: Создается DataFrame на основе словаря, содержащего столбцы Complete_Name и Surname.
  3. Функция проверки: check_cross_check_name_and_surname принимает DataFrame и применяет условие для каждой строки. Она возвращает True, если фамилия содержится в полном имени, и False в противном случае.
  4. Определение схемы: Создается DataFrameSchema, который включает в себя проверки на соответствие.
  5. Проверка данных: При вызове метода validate проверяется, соответствуют ли данные схеме. В случае ошибки, выводится информация об ошибке.

Таким образом, вы сможете убедиться, что каждое полное имя включает соответствующую фамилию, используя Pandera.

Оцените материал
Добавить комментарий

Капча загружается...