Вопрос или проблема
У меня есть схема 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'
.
Вот подробное решение вашей задачи:
- Импортируйте необходимые библиотеки.
- Определите схему DataFrame с вашей проверкой.
- Напишите логику проверки, которая будет использовать метод
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)
Пояснения к коду:
- Импорт библиотек: Мы импортируем необходимые библиотеки для работы с данными и схемами.
- Пример данных: Создается DataFrame на основе словаря, содержащего столбцы
Complete_Name
иSurname
. - Функция проверки:
check_cross_check_name_and_surname
принимает DataFrame и применяет условие для каждой строки. Она возвращаетTrue
, если фамилия содержится в полном имени, иFalse
в противном случае. - Определение схемы: Создается
DataFrameSchema
, который включает в себя проверки на соответствие. - Проверка данных: При вызове метода
validate
проверяется, соответствуют ли данные схеме. В случае ошибки, выводится информация об ошибке.
Таким образом, вы сможете убедиться, что каждое полное имя включает соответствующую фамилию, используя Pandera.