如何合并多个数据集在合并索引字符串的差异?



你好,我正在努力寻找一个解决方案,可能是一个非常常见的问题。

我想合并两个csv文件与足球数据。它们基本上存储同一款游戏的不同数据。通常我会与.merge合并,但问题是,两个数据集中的一些团队的命名法不同。例如,Manchester City在第二数据帧中被称为Man. City

df1和df2大致是这样的:

p>
team1            team2     date                      some_value_i_want_to_compare
Manchester City  Arsenal   2022-05-20 22:00:00 0.2812  5

df2:

team1       team2     date                      some_value_i_want_to_compare
Man. City   Arsenal   2022-05-20 22:00:00 0.2812  3

请注意,在上述情况下,只有team1存在差异,但team2也可能略有不同。因此,在这种情况下,Arsenal可以在第二个数据集中称为FC Arsenal

所以我的主要问题是:我如何自动分析两个数据集命名的差异?

我的第二个问题是:我如何将其扩展到2个以上的数据集,以便数据集的数量最终不重要?

正如评论者和现有答案所建议的,如果唯一名称的数量不是太大,那么您可以手动提取不匹配并纠正它们。这可能是最好的解决方案,除非不匹配的数量非常大。

另一种可能发生的情况是,您有一个允许索引的真实列表(例如,给定联赛中所有足球队的列表),但是数据可能包含对每个球队的拼写或缩写的许多不同尝试。如果这与您的情况类似,则可以使用difflib搜索给定名称的最可能匹配项。例如:

import difflib
true_names = ['Manchester United', 'Chelsea']
mismatch_names = ['Man. Unites', 'Chlsea', 'Chelsee']
best_matches = [difflib.get_close_matches(x, true_names, n=1) for x in mismatch_names]
for old,new in zip(mismatch_names, best_matches):
print(f"Best match for {old} is {new[0]}")

输出:

Best match for Man. Unites is Manchester United
Best match for Chlsea is Chelsea
Best match for Chelsee is Chelsea

注意,如果拼写非常糟糕,您可以要求difflib使用n=关键字参数查找最接近的n匹配。这可以帮助减少手动数据清理工作,尽管这通常是不可避免的,至少在某种程度上。

希望有帮助。

您可以从反连接开始,隔离不匹配的:

# Merge two team datasets
teams_join = df1.merge(df2, on='team1', 
how='left', indicator=True)
# Select the team1 column where _merge is left_only
team_list = teams_join.loc[teams_join['_merge'] == 'left_only', 'team1']
# print team names in df1 with no match in df2
print(df1[df1["team1"].isin(team_list)])

这将给你所有的球队在df1没有比赛在df2。您可以对df2执行相同的操作(只需将前面代码中df1和df2的所有内容颠倒)。然后,您可以使用这两个名称不匹配的列表,如果它们足够少,则手动重命名它们。

最新更新