无论df1['LineA']
与df2['LineA']
匹配的位置,我都尝试合并两个数据框。
但是对于df2
的索引1,这仅向我提供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])
有人能指出我正确的方向吗?谢谢
答案 0 :(得分:2)
一种方法是处理括号并使用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