我想将两个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
-在第一个评论后进行编辑-
因此,主要问题是:如何自动分析两个数据集命名的差异?有用的事实:
因此,如果Dataset1说:
1.1.2018 Real - Atletic Club
Dataset2说:
1.1.2018 Real - Atletic Bilbao
我们应该能够分析以下内容:{'Atletic Club':'Atletic Bilbao'}
答案 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")