我可以组合 contains 和startswith 来将一个数据帧中的两列匹配到另一个数据帧的主列吗?

问题描述 投票:0回答:1

大家好。
我正在努力解决这个问题,但我没有在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('')
python pandas contains string-matching startswith
1个回答
0
投票

如果您有这两个数据框:

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
© www.soinside.com 2019 - 2024. All rights reserved.