首页 > 解决方案 > 数据框中常见列之间的精确视觉匹配在合并时不匹配

问题描述

我正在尝试在一个公共列“long_name”上合并两个数据框。但是当我在“long_name”上合并时,某些名称并没有发生合并,即使看起来像视觉上完全匹配的名称(即“Lionel Andrés Messi Cuccittini”(df1)到“Lionel Andrés Messi Cuccittini”(df2)):

df_merged = df.merge(df1, on="long_name", indicator=True, how='right')

Lionel Messi 被排除在外,根据指标列,他是合并中的“right_only”行。奇怪的是,“内马尔·达席尔瓦·桑托斯·小桑托斯”正在合并。为什么行之间存在差异?两者的来源都是一致的,df 来自 kaggle,df2 来自抓取,并且对所有行名提取使用相同的脚本。

我尝试使用以下代码将 Lionel Messi 条目与 df 和 df1 隔离开来:

name1 = df.loc[df.short_name == 'L. Messi', ["long_name"]]

name2 = df1.loc[df1.name == 'Lionel Messi', ["long_name"]]

name1.values == name2.values

但结果是array([[False]])。我不确定他们为什么不匹配。

第一个 df 看起来像这样(前 8 行,df = df.loc[0:7,["short_name", "long_name"]]):

          short_name                            long_name
0           L. Messi       Lionel Andrés Messi Cuccittini
1  Cristiano Ronaldo  Cristiano Ronaldo dos Santos Aveiro
2          Neymar Jr        Neymar da Silva Santos Junior
3           J. Oblak                            Jan Oblak
4          E. Hazard                          Eden Hazard
5       K. De Bruyne                      Kevin De Bruyne
6      M. ter Stegen                Marc-André ter Stegen
7        V. van Dijk                      Virgil van Dijk

第二个 df 看起来像这样(前 8 行,df1 = df1.loc[0:7,["name", "long_name"]]):

                name                      long_name
0      Kylian Mbappé     Kylian Sanmi Mbappé Lottin
1             Neymar  Neymar da Silva Santos Júnior
2      Mohamed Salah                      محمد صلاح
3         Harry Kane              Harry Edward Kane
4        Eden Hazard            Eden Michael Hazard
5       Lionel Messi  Lionel Andrés Messi Cuccitini
6    Raheem Sterling      Raheem Shaquille Sterling
7  Antoine Griezmann              Antoine Griezmann

标签: pythonstringpandasdataframemerge

解决方案


您确定这不仅仅是名称拼写错误的情况吗?

df将其long_name列为Lionel Andrés Messi Cuccittini,而df1将其列为Lionel Andrés Messi Cuccitini。我注意到df有 2tCuccittinidf有 1。

手动更正第二个数据帧并重试。


推荐阅读