您好,我正在努力尋找可能是一個非常常見的問題的解決方案。
我想將兩個 csv 檔案與足球資料合并。它們基本上存盤相同游戲的不同資料。通常我會與 進行合并.merge,但問題是,兩個資料集中的某些團隊的命名法不同。例如在第二個資料幀Manchester City中呼叫。Man. City
df1 和 df2 大致如下:
東風:
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 個以上的資料集,以使資料集的數量最終無關緊要?
uj5u.com熱心網友回復:
正如評論者和現有答案所建議的那樣,如果唯一名稱的數量不是太多,那么您可以手動提取不匹配并更正它們。這可能是最好的解決方案,除非不匹配的數量非常大。
另一種可能發生的情況是,當您有一個允許索引的基本事實串列(例如,給定聯賽中所有足球隊的串列)時,但資料可能包含許多不同的拼寫或縮寫每個球隊的嘗試。如果這與您的情況相似,您可以使用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=這有助于減少手動資料清理作業,盡管這通常是不可避免的,至少在某種程度上是這樣。
希望能幫助到你。
uj5u.com熱心網友回復:
你可以先做一個反連接來隔離那些不匹配的:
# 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 )。然后,您可以使用名稱不匹配的這兩個串列,并在它們足夠少時手動重命名它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474547.html
上一篇:查找特定值知道行熊貓
