大家好。
我正在努力解决这个问题,但我没有在SO上找到任何类似的东西。
主数据框填充了特定比赛的球员和统计数据。
34 列和可变行数。
列“玩家”有全名
玩家 | 目标 | 助攻 |
---|---|---|
多米尼克·卡尔弗特-勒温 | 1 | 1 |
贝托 | 2 | 0 |
贾拉德·布兰思韦特 | 0 | 1 |
杰克·哈里森 | 0 | 0 |
Snippet数据框,仅显示带有裁判注释的球员(黄牌、红牌)。 由 3 列组成。问题是名字要么是全名、首字母要么是空白。
名字 | 姓氏 | 原因 |
---|---|---|
D | 卡尔弗特-勒温 | 犯规 |
贝托 | 浪费时间 | |
杰克 | 哈里森 |
我想要实现的目标:
匹配“名字”可能使用startswith以及使用包含的“姓氏”,以及masterdf中的玩家。
如果两列都匹配,则将一列添加到 Snippet df 并带有全名。
预期数据框:
玩家 | 原因 |
---|---|
多米尼克·卡尔弗特-勒温 | 犯规 |
贝托 | 浪费时间 |
杰克·哈里森 |
到目前为止我只有一对一的匹配:
pat1 = '('+'|'.join(Snippet['Last Name'])+')'
Master["Yellow"] = Master['Player'].str.extract(pat1)[0].map(Snippet.set_index('Last Name')['Cause'].to_dict()).fillna('')
如果您有这两个数据框:
df_master
Player Goals Assists
0 Dominic Calvert-Lewin 1 1
1 Beto 2 0
2 Jarrad Branthwaite 0 1
3 Jack Harrison 0 0
df_snippet
First Name Last Name Cause
0 D Calvert-Lewin Foul
1 NaN Beto Time Wasting
2 Jack Harrison NaN
3 Hello World NaN
然后你可以这样做:
df_snippet["First Name"] = df_snippet["First Name"].fillna("")
out = []
for _, row in df2.iterrows():
m1 = df_master["Player"].str.startswith(row["First Name"])
m2 = df_master["Player"].str.endswith(row["Last Name"])
m = m1 & m2
if m.any():
out.append(df_master.loc[m.idxmax(), "Player"])
else:
out.append(None)
df_snippet["Player"] = out
print(df_snippet)
打印:
First Name Last Name Cause Player
0 D Calvert-Lewin Foul Dominic Calvert-Lewin
1 Beto Time Wasting Beto
2 Jack Harrison NaN Jack Harrison
3 Hello World NaN None