用等效字符串清洗列

时间:2019-10-25 19:05:26

标签: python pandas

我有一个要编码的足球比赛清单。 固有的问题是,有时同一团队的团队名称会以不同的形式出现。例如:

data = {'Match': ['FC Milan - Juventus','Juventus - Milan FC ',
                  ' Juventus - Inter', 'Inter - Juventus F.C.',
                  'FC Milan - Inter   Milan', 'Inter Milan - Milan FC']}
index = range(len(data['Match']))
columns = ['Match']
df = pd.DataFrame(data,  index=index, columns=columns)
df

df

“尤文图斯”实际上等同于“尤文图斯FC”。等等。还要注意一些在此处的前后空格。

我想将比赛编码为独立于在家或客场的分类变量。在前面的示例中,预期结果应该是:

[1,1,2,2,3,3]

我最好的尝试是将大风在'-'分开以获取团队名称,从空间中剥离他们,在最终的空间中再次将它们分开,并花费最长的一半希望摆脱所有无用的东西(FC, FC等)

teams = df['Match'].str.split(' - ', expand=True) #get team names
print(teams)

test = teams[0].str.lower().str.strip().str.split(' ', expand=True) #split them
test = test.fillna('a') #get rid on nans replacing them with smtg meaningless
print(test)

new_list = [test[0][i] if len(test[0][i])>len(test[1][i]) else test[1][i] for i in range(6)] #take the longest split as team name
new_list

但是,对于“国际米兰”这样的情况,当两半相等并且在不同团队之间共享时(例如“国际米兰”和“米兰”),这种情况就会分解。 另外,我不确定如何对匹配进行编码...


有人看到解决这个问题的好方法吗?

1 个答案:

答案 0 :(得分:1)

我的方法是尽可能规范地列出球队名称。然后,使用difflib将每个团队名称与其规范名称进行匹配。

这可以通过从数据中创建一组团队名称,对整个团队进行匹配,然后从每个唯一的团队名称到其规范的团队名称创建字典来进行一些优化。我不知道您的要求是什么,但这可能不是必需的。

import difflib # Python is batteries included

data = {'Match': ['FC Milan - Juventus','Juventus - Milan FC ',
                  ' Juventus - Inter', 'Inter - Juventus F.C.',
                  'FC Milan - Inter   Milan', 'Inter Milan - Milan FC']}

canonical_teams = (
    'Juventus', 
    'Inter Milan', 
    'Atalanta', 
    'Napoli', 
    'Cagliari', 
    'Roma', 
    'Lazio', 
    'Parma', 
    'Milan'
    #... You get the idea
    )

matches = [
    (
        difflib.get_close_matches(team1, canonical_teams,n=1, cutoff=0)[0], 
        difflib.get_close_matches(team2, canonical_teams, n=1, cutoff=0)[0]
    ) 
    for team1, team2 
    in [
        matchup.split("-") 
        for matchup 
        in data["Match"]
    ]
]

# matches =>
# [
#     ('Milan', 'Juventus'), 
#     ('Juventus', 'Milan'), 
#     ('Juventus', 'Inter Milan'), 
#     ('Inter Milan', 'Juventus'), 
#     ('Milan', 'Inter Milan'), 
#     ('Inter Milan', 'Milan')
# ]

嵌套列表理解的道歉。我懒于常规数据处理任务。

可以通过添加逻辑来使之具有交互性,以在匹配不强时向您发出警报,以便您可以手动更正。这不是一个完美的解决方案,但我猜想它可以为您提供95%的解决方案。