Проверить значение из нескольких колонок датафрейма на наличие в другом датафрейме
Есть два датафрейма
pd.DataFrame(
{
"col1": ["string1", "dd", "string2", {"name": "first_name", "dec": "description 102"}],
"col2": [{"name": "last_name", "dec": "description 103"}, "string1", np.nan, "string2"],
"col3": ["string1", {"name": "last_name", "dec": "description 103"}, "gg", "string33", ],
}
)
df2 = pd.DataFrame(
{
"string": ["string1", "string2"],
"name": ["first_name", "last_name"],
"desc": ["description 102", "description 103"]
}
)
нужно провести валидацию первого датафрейма, и оставить те строки, в которых каждое значение валидно.
Вылидные они, если значение совпадает с колонкой df2.string или значение-словарь совпадает с парой из df2[["name", "desc"]]
В голову приходит решение только писать кастомную функцию, которая будет итерироваться по строкам и просматривать каждое значение из колонки. Можно ли как-то использовать apply() метод, чтобы это было более по pandas`овски?
Для сравнения словаря использовал
value in df2[["name", "desc"]].to_dict(orient='records')
Ответы (1 шт):
Если навскидку, то вам как раз придется избавляться от словарей, потому что они - нехешируемый тип данных.
Вероятнее всего, у вас будет работать подобная конструкция:
masker = df1.applymap(lambda x: tuple(x.values()) if type(x)==dict else x)
res= df1[masker.isin(list(df2["string"].values)) | masker.isin(list(map(tuple, df2[["name", "desc"]].values.tolist())))]
Ваш пример, однако, непоказателен, потому что по вашему же условию, все его строки попадут в результат.