Как определить строки df1, содержащие элементы из df2 в Python?

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

У меня есть два датафрейма, которые я хотел бы сравнить, и мне нужно знать, существуют ли объекты, хранящиеся в df1, также в df2.

Однако объекты в df2 длиннее из-за множества дополнительных данных.

В качестве примера, мой df1:
вставьте описание изображения здесь

а затем, мой df2:
вставьте описание изображения здесь

Существует ли способ получить строки df1, для которых число в df1 также присутствует в df2?

Я уже пробовал следующие стратегии, но они не работают должным образом (возвращают nan):

  1. df1[“TrueFalse”] = df2[‘data_name’].apply(lambda x: 1 if any(i in x for i in df1) else 0)
  2. 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)

Объяснение кода:

  1. Создание DataFrames: Мы создаем два DataFrame df1 и df2 с примерами данных.

  2. Шаблон для поиска: Мы объединяем все значения из столбца data1 в строку, разделённую символом |, что позволяет использовать это как регулярное выражение.

  3. Проверка наличия: С помощью метода str.contains() мы добавляем новый столбец contains в df2, который будет содержать True или False в зависимости от наличия подстрок из df1.

  4. Извлечение совпадающих значений: Мы используем isin(), чтобы отфильтровать строки df1, которые присутствуют в df2.

  5. Вывод результат: В конце мы выводим строки из df1, которые были найдены в df2.

Таким образом, вы сможете достичь своей цели, эффективно сравнивая два DataFrame и находя соответствия между ними.

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

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