如何基于多列正则匹配规则实现pandas表格合并
Pandas按两列正则匹配合并DataFrame实现方法
实现思路
先将两个DataFrame做笛卡尔积得到所有行的两两组合,再筛选出同时满足a列正则匹配、b列正则匹配的行,最终整理得到目标结果。
步骤1:导入依赖与定义示例数据
import pandas as pd # 定义df1 df1 = pd.DataFrame({'a': ['foo', 'bar','zoolo','foo','foo'], 'b': ['tty','abc', 'uhg','abc','tty'], 'c':[14,72,93,33,57]}) # 定义df2 df2 = pd.DataFrame({'a': ['zool(o|r)','foo|oof','[badr]+'],'b': ['uh(f|g)','[ty]+','abc|bac'], 'j': [11,32,65]})
步骤2:核心实现代码
# 1. 交叉合并(笛卡尔积)得到所有行组合,pandas1.2.0+支持how='cross' cross_df = df1.merge(df2, how='cross', suffixes=('_df1', '_df2')) # 低版本pandas兼容写法,替换上面交叉合并代码即可 # cross_df = df1.assign(tmp_key=1).merge(df2.assign(tmp_key=1), on='tmp_key').drop('tmp_key', axis=1) # 2. 筛选同时满足a列、b列全量正则匹配的行 match_mask = ( cross_df.apply(lambda x: bool(str.fullmatch(x['a_df2'], x['a_df1'])), axis=1) & cross_df.apply(lambda x: bool(str.fullmatch(x['b_df2'], x['b_df1'])), axis=1) ) # 3. 整理列顺序、重置索引得到最终结果df3 df3 = cross_df[match_mask][['a_df1', 'b_df1', 'c', 'j']].rename(columns={'a_df1':'a', 'b_df1':'b'}).reset_index(drop=True)
结果验证
输出df3即可得到预期结果:
| 索引 | a | b | c | j |
|---|---|---|---|---|
| 0 | foo | tty | 14 | 32 |
| 1 | bar | abc | 72 | 65 |
| 2 | zoolo | uhg | 93 | 11 |
| 3 | foo | tty | 57 | 32 |
内容的提问来源于stack exchange,提问作者jadeidev
相关产品推荐
相关产品推荐

