首页 > 解决方案 > 合并熊猫时匹配子字符串

问题描述

我正在尝试在df1['LineA']df2['LineA'].

但是对于 的索引 1 df2,这只是为我提供了 A 行:2。

我无法获得所需输出的第三行。

df1

    PointA    LineA   PointB      ID

0     A        2        D   
1     A        3        K
2     B        2        F   
3     C        3        M   
df2

   PointA   LineA    ID 
0    A         2       129
1    A         2(3)    233
2    A         2       560
3    A         3       321
4    A         3       340
5    B         2       213

期望的输出:


   PointA    LineA   PointB   ID
0   A          2        D      129
1   A          2        D      233
2   A          2        D      560
3   A          3        K     *233*
4   A          3        K      321
5   A          3        K      340
6   B          2        F      213
7   C          3        M      

我使用了以下代码:

df2.LineA = df2.LineA.map(lambda x: difflib.get_close_matches(x, df1.LineA)[0])

有人可以指出我正确的方向。谢谢

标签: pythonpandasmerge

解决方案


一种方法是处理括号并使用pandas.DataFrame.explode创建一个新行:

df1 = pd.DataFrame({'PointA':['A','A','B','C'],
                    'LineA': [2,3,2,3],
                    'LineB': ['D', 'K', 'F', 'M']})

df2 = pd.DataFrame({'PointA':['A','A','A','A','A','B'],
                    'LineA': [2, '2(3)', 2, 3,3, 2],
                    'ID': [129, 233, 560, 321, 340, 213]})


df1['LineA'] = df1['LineA'].astype(str)
df2['LineA'] = df2['LineA'].astype(str)

df2['LineA'] = df2['LineA'].str.replace(')', '').str.split(r'(')
df2 = df2.explode('LineA')

pd.merge(df1, df2, on=['PointA', 'LineA'], how='outer')
  PointA LineA LineB     ID
0      A     2     D  129.0
1      A     2     D  233.0
2      A     2     D  560.0
3      A     3     K  233.0
4      A     3     K  321.0
5      A     3     K  340.0
6      B     2     F  213.0
7      C     3     M    NaN

推荐阅读