String 基于两个不同列之间的匹配子字符串合并数据帧

String 基于两个不同列之间的匹配子字符串合并数据帧,string,pandas,dataframe,merge,substring,String,Pandas,Dataframe,Merge,Substring,这里我的问题是使用python/pandas连接两个不同的名称字段(没有这么多例外) 我有两个数据帧,我想在其中合并df1的'short_name'或'long_name'和df2的'name' df 1: df 2: 我修改了df2的“name”列,以遵循df1的“short_name”列的首字母和姓氏约定。不幸的是,这导致了许多例外,因为df2的“名称”栏并不总是遵循这种惯例(例如,“小内马尔”(预计为:“内马尔”)、克里斯蒂亚诺·罗纳尔多(预计为C·罗纳尔多)和罗伯托·菲尔米诺(预计为R·

这里我的问题是使用python/pandas连接两个不同的名称字段(没有这么多例外)

我有两个数据帧,我想在其中合并df1的'short_name'或'long_name'和df2的'name'

df 1:

df 2:

我修改了df2的“name”列,以遵循df1的“short_name”列的首字母和姓氏约定。不幸的是,这导致了许多例外,因为df2的“名称”栏并不总是遵循这种惯例(例如,“小内马尔”(预计为:“内马尔”)、克里斯蒂亚诺·罗纳尔多(预计为C·罗纳尔多)和罗伯托·菲尔米诺(预计为R·菲尔米诺)

我唯一能想到的是使用子字符串匹配。 是否有办法将df2的“名称”列拆分为单独的子字符串,然后查看df1的“long_name”是否包含所有这些元素(即查看“Lionel Andrés Mesi Cuccittini”是否同时包含d1名称中的“Lionel”和“Mesi”,然后合并在其上)

搜索了一段时间后,它看起来不像pandas功能中的某个东西,因为它将它拆分为几列。我也不知道合并是否可以采用子字符串匹配之类的条件。我想到的一切都没有解决这些异常/非匹配,除了子字符串匹配

编辑:正如另一位用户所说,将名称拆分为多个集合并确保df2中“name”中的所有子字符串都在df1中的“long_name”中找到可能是值得的。但我似乎找不到一种不将字符串拆分为单独列的方法来做到这一点

已解决:似乎有效的方法是隔离并创建列的副本(使其成为系列),然后将名称拆分为列表,并查看较短的名称是否是双for循环中较长名称的子集。以下是我的代码:

names = df1['name']
long_names = df2['long_name']

for i in range(len(names)):
    name_list = names[i].split()
    for j in range(len(long_names)):
        long_name_list = long_names[j].split()
        if set(name_list).issubset(long_name_list):
            df2.loc[j, "long_name"] = df1.loc[i, "name"]

这回答了你的问题吗?不幸的是,我不这么认为。这个问题是通过匹配子字符串来合并的,我认为这个问题的答案中没有提到。你可以尝试将df2[“name”]和df1[“long_name”]拆分为一个空格,然后尝试使用集合来获得匹配。这就是我的意思:``x=set(“Lionel mesi”.split())y=set(“Lionel Andrés mesi Cuccittini”.split())``然后,您可以检查set(x).issubset(y)@Jorgavila我试图在dfs上使用它,但我正在运行我无法将其拆分为集合,它们会产生新的列。你能提供一个使用集合和数据帧/系列的代码示例吗?这是否回答了你的问题?不幸的是,我不这么认为。问题是通过匹配子字符串进行合并,我认为这不是地址你可以尝试将df2[“name”]和df1[“long_name”]分割成一个空格,然后尝试使用集合进行匹配。这就是我的意思:``x=set(“Lionel mesi.split())y=set(“Lionel Andrés mesi Cuccittini.split()”``然后,你可以检查set(x).issubset(y)@Jorgavila我正试图在dfs上使用它,但我正在运行我无法将其拆分为集合,它们会产生新的列。您能否提供一个使用集合和数据帧/系列的代码示例?
                      name     2014      2015      2016      2017      2018  \
0             Kylian Mbappé      NaN    0.0570    1.9238   51.3000  175.5600   
1                    Neymar   74.100   98.8000  114.0000  133.0000  205.2000   
2             Mohamed Salah   14.820   17.1000   26.6000   39.9000  144.4000   
3                Harry Kane    3.420   22.8000   41.8000   72.2000  159.6000   
4               Eden Hazard   53.010   74.1000   76.0000   82.6500  143.6400   
5              Lionel Messi  136.800  136.8000  136.8000  136.8000  197.6000 
names = df1['name']
long_names = df2['long_name']

for i in range(len(names)):
    name_list = names[i].split()
    for j in range(len(long_names)):
        long_name_list = long_names[j].split()
        if set(name_list).issubset(long_name_list):
            df2.loc[j, "long_name"] = df1.loc[i, "name"]