python - 合并熊猫时匹配子字符串
问题描述
我正在尝试在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])
有人可以指出我正确的方向。谢谢
解决方案
一种方法是处理括号并使用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
推荐阅读
- python - 在python中将套接字绑定到本地地址的权限被拒绝
- pandas - 数据框到字典收集特定值
- nginx - 在 URL /path/ 下运行 CKAN 的 CKAN 和 NGINX conf
- amazon-web-services - AWS ES 测试域与生产域有何不同?
- python - Pandas - 如何获取列中每个值的出现次数
- django - 是否可以在 Django 应用程序中使用离子电容器?
- c++ - 重置移动对象的常用习语是什么?
- variables - 请打开我的电脑并为我阅读您的 Windows 10 环境变量 PATH 设置
- asp.net-core - 使用 asp.net 身份完成注册的电子邮件邀请
- mysql - 如何在超过 3 个表上进行不同的连接