如何在path / filename的尾部连接两个pandas DataFrames

7xllpg7q  于 2023-05-27  发布在  其他
关注(0)|答案(2)|浏览(98)

我有两个 Dataframe 如下。

df1 = pd.DataFrame({'PATH':[r'C:\FODLER\Test1.jpg',
                            r'C:\A\FODLER\Test2.jpg',
                            r'C:\A\FODLER\Test3.jpg',
                            r'C:\A\FODLER\Test4.jpg'],
                    'VALUE':[45,23,45,2]})

df2 = pd.DataFrame({'F_NAME': [r'FODLER\Test1.jpg',
                               r'FODLER\Test2.jpg',
                               r'FODLER\Test6.jpg',
                               r'FODLER\Test3.jpg',
                               r'FODLER\Test4.jpg',
                               r'FODLER\Test9.jpg'],
                    'VALUE_X': ['12', '25', '97', '33', '123', '0'],
                    'CORDS': ['1', '2', '3', '4', '5', '6']})

我想连接df2,其中PATH.Contains(F_NAME)到df1表。因此得到的 Dataframe 如下:

df3 = pd.DataFrame({'PATH':[r'C:\FODLER\Test1.jpg',
                            r'C:\A\FODLER\Test2.jpg',
                            r'C:\A\FODLER\Test3.jpg',
                            r'C:\A\FODLER\Test4.jpg'],
                    'F_NAME': [r'FODLER\Test1.jpg',
                               r'FODLER\Test2.jpg',
                               r'FODLER\Test3.jpg',
                               r'FODLER\Test4.jpg'],
                    'VALUE_X': ['12', '25', '33', '123'],
                    'CORDS': ['1', '2', '4', '5'],
                    'VALUE':[45,23,45,2]})

我如何编写pandas merge语句来完成这种连接?

jdgnovmf

jdgnovmf1#

您可以使用merge和正则表达式using str.extract来提取路径的行尾锚定部分:

import re

pattern = f"({'|'.join(df2['F_NAME'].apply(re.escape))})$"

df3 = df1.merge(df2, left_on=df1['PATH'].str.extract(pattern, expand=False),
                right_on='F_NAME', how='left')

输出:

PATH  VALUE            F_NAME VALUE_X CORDS
0    C:\FODLER\Test1.jpg     45  FODLER\Test1.jpg      12     1
1  C:\A\FODLER\Test2.jpg     23  FODLER\Test2.jpg      25     2
2  C:\A\FODLER\Test3.jpg     45  FODLER\Test3.jpg      33     4
3  C:\A\FODLER\Test4.jpg      2  FODLER\Test4.jpg     123     5

pattern

(FODLER\\Test1\.jpg|FODLER\\Test2\.jpg|FODLER\\Test6\.jpg|FODLER\\Test3\.jpg|FODLER\\Test4\.jpg|FODLER\\Test9\.jpg)$

regex demo
或者,如果PATH只有2个组件(folder\filename.ext),您可以在合并之前为列分配路径的尾部:

df3 = (df1
    .assign(F_NAME=df1['PATH'].str.extract(r'([^\\]+\\[^\\]+)$', expand=False))
    .merge(df2, how='left')
)

regex demo

xxls0lw8

xxls0lw82#

你能试试这个吗:

df3 = df1[df1['PATH'].str.contains('|'.join(df2['F_NAME']))].merge(df2, left_on=df1['PATH'], right_on=df2['F_NAME'], how='left')

print(df3)

相关问题