如何合并两组具有合并索引字符串差异的数据?

时间:2018-12-22 21:25:46

标签: python pandas dataframe merge

我想将两个csv文件与足球数据合并。他们拥有相同和不同游戏的不同数据(部分重叠)。通常,我会与df.merge进行合并,但是问题是,这两个数据集中的某些团队的术语有所不同。例如。在第二组中,“毕尔巴鄂竞技”被称为“俱乐部竞技”。

因此,我希望规范两个数据集上的团队命名,以便能够对日期和团队名称进行简单的df.merge-operation。此刻,当一支球队在两组比赛中拥有不同的名字时,这将导致额外的比赛。

所以我的主要问题是:如何轻松地在两个集合中规范团队名称,而不必分析其中一组的“手工”和“替换”操作的硬性差异?

数据集1可在此处下载: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':'Atletic Bilbao'}

2 个答案:

答案 0 :(得分:1)

这就是我最终可以解决此问题的方法:

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
...

答案 1 :(得分:0)

假设您的日期兼容(并且正确),这应该可以生成翻译词典。我认为,这类事情总是非常脆弱,您不应该真正依赖它。

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")