You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现忽略小数点后前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']])

代码说明

  1. 统一格式:用str.replace('.', '', regex=False)去掉小数点,避免因小数位数不一致导致的匹配错误(比如52.01和52.0100会转为相同的5201)。
  2. 拆分前后缀:用str[:4]提取前4位作为匹配的核心标识,str[4:]提取剩余部分用于排除重复项。
  3. 分组匹配:通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:53:13