如何实现忽略小数点后前4位相同、其余位不同的DataFrame行匹配?
解决CIPCODE列的匹配问题
问题分析
你需要实现的匹配规则本质是:将每个CIPCODE去掉小数点后转为连续数字串,要求匹配的行满足两个核心条件:
- 数字串的前4位完全相同
- 数字串除前4位外的剩余部分完全不同
- 必须排除行自身
你的原有代码仅处理了小数点前的部分,且startswith的逻辑不符合规则要求,需要重新梳理处理流程。
解决方案代码
import pandas as pd # 示例测试数据 data = {'CIPCODE': [52.0101, 52.0102, 52.0101, 53.0101, 52.0103]} df = pd.DataFrame(data) # 步骤1:将CIPCODE转为无小数点的字符串,统一格式 df['CIPCODE_str'] = df['CIPCODE'].astype(str).str.replace('.', '', regex=False) # 步骤2:拆分前缀(前4位)和后缀(剩余数字部分) df['prefix'] = df['CIPCODE_str'].str[:4] df['suffix'] = df['CIPCODE_str'].str[4:] # 步骤3:分组处理,在同前缀组内筛选后缀不同的其他行 def get_matches_in_group(group): # 对组内每行,返回符合条件的行索引列表 group['matches'] = group.apply( lambda row: group[group['suffix'] != row['suffix']].index.tolist(), axis=1 ) return group # 按前缀分组处理,提升匹配效率 df = df.groupby('prefix', group_keys=False).apply(get_matches_in_group) # 查看最终结果 print(df[['CIPCODE', 'matches']])
代码说明
- 统一格式:用
str.replace('.', '', regex=False)去掉小数点,避免因小数位数不一致导致的匹配错误(比如52.01和52.0100会转为相同的5201)。 - 拆分前后缀:用
str[:4]提取前4位作为匹配的核心标识,str[4:]提取剩余部分用于排除重复项。 - 分组匹配:通过
groupby('prefix')将相同前缀的行归为一组,在组内仅筛选后缀不同的行,既保证匹配效率,又精准符合规则。
示例输出
CIPCODE matches 0 52.0101 [1, 4] 1 52.0102 [0, 2, 4] 2 52.0101 [1, 4] 3 53.0101 [] 4 52.0103 [0, 1, 2]
可以看到:
52.0101(索引0)匹配52.0102(1)和52.0103(4),不匹配同后缀的52.0101(2)53.0101没有同前缀的其他行,匹配结果为空
内容的提问来源于stack exchange,提问作者analyst92
相关产品推荐
相关产品推荐

