Вопрос или проблема
У меня есть 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)
Заключение
Таким образом, мы можем автоматически сопоставлять и объединять столбцы из двух наборов данных, используя регулярные выражения и анализ имен. Такой подход делает систему гибкой и масштабируемой для обработки различных наборов данных, сохраняя актуальность и точность информации.
Также стоит отметить, что данный метод не требует обучения машинного обучения, что делает его более простым и быстрым в реализации для данного типа задачи. Сложность может возрастать с увеличением количества наборов данных и их разнообразия, что может потребовать более структурированного подхода, включая использование алгоритмов машинного обучения для более сложных случаев.