Совпадение подстроки при объединении Pandas - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь объединить два кадра данных везде, где df1['LineA'] совпадает с df2['LineA'].

Но для индекса 1 из df2 это просто дает мне строку A: 2.

У меня проблемы с получением 3-й строки желаемого результата.

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])

Может ли кто-нибудь направить меня в правильном направлении. Спасибо

1 Ответ

2 голосов
/ 30 марта 2020

Одним из способов является работа с круглыми скобками и создание новой строки с помощью 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
...