Как объединить два набора данных с различиями в строках индекса слияния? - PullRequest
0 голосов
/ 23 декабря 2018

Я хочу объединить два csv-файла с футбольными данными.Они содержат разные данные одной и той же и разных игр (частичное совпадение).Обычно я делаю слияние с df.merge, но проблема в том, что номенклатура отличается для некоторых команд в двух наборах данных.Например, «Атлетик Бильбао» называется «Клуб Атлетик» во втором сете.

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

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

Dataset1 доступен для скачивания здесь: https://data.fivethirtyeight.com/#soccer-spi Dataset2 не доступен свободно, но выглядит так:

hometeam            awayteam    date                homeproba   drawproba   awayproba   homexg  awayxg  
Manchester United   Leicester   2018-08-10 22:00:00 0.2812      0.3275      0.3913      1.5137  1.73813 

- Редактировать после первых комментариев -

Итак, главный вопрос: как я могу автоматически анализировать различия в именовании двух наборов данных?Полезные факты:

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

Итак, если Dataset1 говорит:

1.1.2018 Real - Atletic Club 

И Dataset2 говорит:

1.1.2018 Real - Atletic Bilbao

Мы должны быть в состоянии проанализировать это: {'Atletic Club':«Атлетик Бильбао»}

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Итак, вот как я мог бы решить это окончательно:

import pandas as pd

df_teamnames = pd.merge(dataset1,dataset2,on=['hometeam','date'])
df_teamnames = df_teamnames[['awayteam_x','awayteam_y']]
df_teamnames = df_teamnames.drop_duplicates()

Это дает вам информационный фрейм, содержащий имя каждой команды, существующей в обоих наборах данных, например:

1    Marseille      Marseille
2    Atletic Club   Atletic Bilbao
...
0 голосов
/ 23 декабря 2018

Предполагая, что ваши даты совместимы (и правильны), это должно сработать для создания словаря перевода.Я думаю, что такие вещи всегда очень хрупкие, и на них не стоит полагаться.

import pandas as pd

names_1 = dataset1['hometeam'].unique().tolist()
names_2 = dataset2['hometeam'].unique().tolist()

mapping_dict = dict()
for common_name in set(names_1).intersection(set(names_2)):
    mapping_dict[common_name] = common_name

unknown_1 = set(names_1).difference(set(names_2))
unknown_2 = set(names_2).difference(set(names_1))

trim_df1 = dataset1.loc[:, ['hometeam', 'awayteam', 'date']]
trim_df2 = dataset2.loc[:, ['hometeam', 'awayteam', 'date']]

aligned_data = trim_df1.join(trim_df2, on = ['hometeam', 'date'], how = 'inner', lsuffix = '_1', rsuffix = '_2')

for unknown_name in unknown_1:
    matching_name = aligned_data.loc[aligned_data['awayteam_1'] == unknown_name, 'awayteam_2'].unique()
    if len(matching_name) != 1:
        raise ValueError("Couldn't find a unique match")
    mapping_dict[unknown_name] = matching_name[0]
    unknown_2.remove(matching_name[0])

if len(unknown_2) != 0:
    raise ValueError("We have extra team names for some reason")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...