Вопрос или проблема
У меня есть два датафрейма, которые я хотел бы сравнить, и мне нужно знать, существуют ли объекты, хранящиеся в df1, также в df2.
Однако объекты в df2 длиннее из-за множества дополнительных данных.
В качестве примера, мой df1:
вставьте описание изображения здесь
а затем, мой df2:
вставьте описание изображения здесь
Существует ли способ получить строки df1, для которых число в df1 также присутствует в df2?
Я уже пробовал следующие стратегии, но они не работают должным образом (возвращают nan):
- df1[“TrueFalse”] = df2[‘data_name’].apply(lambda x: 1 if any(i in x for i in df1) else 0)
- df1[‘new_col’] = df1[~df1[‘data1’].isin(df2)]
Спасибо!
Ответ или решение
Чтобы определить строки в df1
, которые содержат значения, присутствующие в df2
, мы можем использовать библиотеку pandas
в Python. Причём, учитывая, что значения в df2
могут содержать дополнительные символы или информацию, необходимо будет применить подход с использованием функции str.contains()
.
Предположим, что df1
выглядит следующим образом:
import pandas as pd
df1 = pd.DataFrame({
'data1': ['123', '456', '789']
})
А df2
может быть представлен следующим образом:
df2 = pd.DataFrame({
'data_name': ['item123_info', 'item456_info', 'item_not_found_789']
})
В данном случае, мы хотим идентифицировать, содержатся ли значения из столбца data1
из df1
в любой строке столбца data_name
из df2
. Для этого мы можем использовать метод apply()
вместе с str.contains()
и join()
для создания регулярного выражения.
Вот полный пример решения данной задачи:
import pandas as pd
# Создаем примерные DataFrame
df1 = pd.DataFrame({'data1': ['123', '456', '789']})
df2 = pd.DataFrame({'data_name': ['item123_info', 'item456_info', 'item_not_found_789']})
# Создаем шаблон для поиска
pattern = '|'.join(df1['data1'].tolist())
# Используем str.contains для проверки, содержатся ли значения из df1 в df2
df2['contains'] = df2['data_name'].str.contains(pattern)
# Теперь можем получить строки из df1, которые присутствуют в df2
df1_with_matches = df1[df1['data1'].isin(df2[df2['contains']]['data_name'].str.extract(r'(\d+)')[0])]
print(df1_with_matches)
Объяснение кода:
-
Создание DataFrames: Мы создаем два DataFrame
df1
иdf2
с примерами данных. -
Шаблон для поиска: Мы объединяем все значения из столбца
data1
в строку, разделённую символом|
, что позволяет использовать это как регулярное выражение. -
Проверка наличия: С помощью метода
str.contains()
мы добавляем новый столбецcontains
вdf2
, который будет содержатьTrue
илиFalse
в зависимости от наличия подстрок изdf1
. -
Извлечение совпадающих значений: Мы используем
isin()
, чтобы отфильтровать строкиdf1
, которые присутствуют вdf2
. - Вывод результат: В конце мы выводим строки из
df1
, которые были найдены вdf2
.
Таким образом, вы сможете достичь своей цели, эффективно сравнивая два DataFrame и находя соответствия между ними.