Существует ли автоматический способ проверить, представляют ли 2 столбца данных одну и ту же информацию?

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

У меня есть 2 набора данных, которые представляют собой перекрывающуюся информацию. Например:

**Набор данных 1 : **
| ID | Дата регистрации | Категория |
|——|———| ——–|
| P123 | 23/2/2019 | 3 |
| P345 | 24/6/2019 | 2 |

**Набор данных 2 : **
| EID | Дата регистрации| Местоположение|
|——|—————-| ——–|
| P666 | 27/4/2020 | NZ |
| P459 | 6/6/2019 | AU |

Что я хочу сделать, так это создать автоматический способ обработки 2 наборов данных, а затем вывести совпадающие столбцы, то есть какие столбцы представляют собой одинаковый тип информации. Здесь, хотя ID и EID имеют разные названия, они оба представляют собой один и тот же тип информации, поскольку оба являются идентификаторами, которые начинаются с P, за которыми следуют 3 числа.

Аналогично, для дат регистрации, хотя даты разные, мы можем сказать по заголовку, что они, вероятно, представляют собой один и тот же тип информации: дата регистрации идентификатора.

Что касается последнего столбца, “Категория” и “Местоположение” вероятно представляют совершенно различную информацию.

В конечном итоге я хочу получить автоматический способ конкатенации соответствующего столбца из Набора данных 1 с его соответствующим столбцом в Наборе данных 2. (Например, конкатенировать P123 и P345 из “ID” в “EID”). И я хочу, чтобы этот метод был как можно более автоматизированным, чтобы он также мог обрабатывать другие наборы данных.

Я подумал, что обучение модели машинного обучения с использованием характеристик информации из каждого столбца для прогнозирования соответствующего столбца в Наборе данных 2 может быть самым выполнимым методом. Однако я затрудняюсь определить, какие признаки извлекать, и является ли модель машинного обучения самым эффективным методом для выполнения этой задачи. Буду очень благодарен за идеи!

Если два столбца данных в вашем наборе данных содержат информацию схожего типа, вы можете найти соответствующие столбцы, используя функцию re.search().
Эта функция принимает регулярный шаблон и строку и ищет этот шаблон в строке. Это вернет совпадение, если поиск будет успешным, или None в противном случае.
Вы можете попробовать использовать следующую функцию

import pandas as pd
import re

def myFunc(data):
  l=[]
  for col in df1:
    p=[x for x in df.get(col)]
    for j in p:
      #print(j)
      if(re.search("^P\d{3}$", str(j))):
        l.append(col)
        break
  return l

data = {'ID': ['P123', 'P345'],'Reg_Date': ['23/2/2019','24/6/2019'], 'Category': [3,2]}      
df = pd.DataFrame(data)
print(myFunc(data))

Выход – [‘ID’]

"^P\d{3}$" – это вернет столбцы с идентификатором.

"^[1-9][1-9]*/[1-9][1-2]*/\d{4}$" – это вернет столбец даты

Аналогично, когда вы используете "^[1-9][1-9]*/[1-9][1-2]*/\d{4}$",
выход, который вы получите, будет :

Выход – [‘Reg_Date’]

После нахождения нужных столбцов вы можете конкатенировать их.

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

Для автоматического сопоставления столбцов из двух наборов данных, представляющих одну и ту же информацию, можно использовать несколько подходов на основе анализа текстовых меток и структур данных. Рассмотрим детальный подход к решению данной задачи с использованием Python и библиотеки pandas.

Подход к проблеме: Анализ и сопоставление столбцов

1. Определение структуры данных

На основании предоставленных примеров мы имеем два датасета:

  • Датасет 1:

    • ID: Строка идентификатора, начинающаяся с "P" и состоящая из трех цифр.
    • Reg Date: Дата регистрации.
    • Category: Категория, представленная числом.
  • Датасет 2:

    • EID: Идентификатор, имеющий схожую структуру.
    • Registration Date: Дата регистрации.
    • Location: Местоположение.

2. Анализ имен столбцов

Первым шагом для автоматического сопоставления является анализ имен столбцов. Мы можем использовать регулярные выражения для выявления схожих паттернов.

import pandas as pd
import re

def find_matching_columns(df1, df2):
    matches = {}

    for col1 in df1.columns:
        for col2 in df2.columns:
            # Сравниваем имена столбцов
            if re.search(r'ID|EID', col1, re.IGNORECASE) and re.search(r'ID|EID', col2, re.IGNORECASE):
                pattern = r"^P\d{3}$"  # Паттерн для идентификаторов
                if df1[col1].apply(lambda x: bool(re.match(pattern, str(x)))).all():
                    matches[col1] = col2

            if re.search(r'Registration|Reg Date', col1, re.IGNORECASE) and re.search(r'Registration|Reg Date', col2, re.IGNORECASE):
                pattern = r"^[1-9][0-9]*/[1-9][1-2]*/\d{4}$"  # Паттерн для даты
                if df1[col1].apply(lambda x: bool(re.match(pattern, str(x)))).all():
                    matches[col1] = col2

    return matches

# Пример использования
data1 = {'ID': ['P123', 'P345'], 'Reg Date': ['23/2/2019', '24/6/2019'], 'Category': [3, 2]}      
df1 = pd.DataFrame(data1)

data2 = {'EID': ['P666', 'P459'], 'Registration Date': ['27/4/2020', '6/6/2019'], 'Location': ['NZ', 'AU']}
df2 = pd.DataFrame(data2)

matching_columns = find_matching_columns(df1, df2)
print(matching_columns)

3. Объединение данных

После нахождения соответствующих столбцов, следующим шагом может быть объединение значений из двух датасетов. В примере ниже мы создадим новый столбец, который будет содержать объединенные данные из соответствующих столбцов.

def concatenate_matching_columns(df1, df2, matches):
    for col1, col2 in matches.items():
        df2[col2 + '_concat'] = df1[col1].astype(str) + '_' + df2[col2].astype(str)

# Объединение данных
concatenate_matching_columns(df1, df2, matching_columns)
print(df2)

Заключение

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

Также стоит отметить, что данный метод не требует обучения машинного обучения, что делает его более простым и быстрым в реализации для данного типа задачи. Сложность может возрастать с увеличением количества наборов данных и их разнообразия, что может потребовать более структурированного подхода, включая использование алгоритмов машинного обучения для более сложных случаев.

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

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