Python pandas按分组匹配列最后8字符替换为长值并补前缀+
你可以按照「预处理号码 -> 提取后8位特征 -> 组内匹配替换」的逻辑实现,完整代码如下:
import pandas as pd import numpy as np # 1. 数据预处理 # 统一ColumnB为字符串格式,避免数字类型导致的匹配异常 df['ColumnB'] = df['ColumnB'].astype(str) # 执行规则2:给以49开头且无+前缀的号码补加+ df['temp_processed_b'] = np.where(df['ColumnB'].str.startswith('49'), "+" + df['ColumnB'], df['ColumnB']) # 提取每个号码的最后8位作为匹配特征 df['last_8_char'] = df['temp_processed_b'].str[-8:] # 2. 同组匹配替换 # 按「分组标识+最后8位」双维度分组,每组取长度最长的号码作为统一值 replace_map = df.groupby(['ColumnA', 'last_8_char'])['temp_processed_b'].apply( lambda x: x.loc[x.str.len().idxmax()] ) # 将统一值映射回原数据集 df['ColumnB'] = df.set_index(['ColumnA', 'last_8_char']).index.map(replace_map) # 3. 输出结果,删除临时列 result = df[['ColumnA', 'ColumnB']]
逻辑说明
- 双维度分组天然实现了同组内后8位的匹配逻辑,不需要额外写比对判断代码:同ColumnA、同后8位的行被分到同一个组,其余行单独成组
- 每个分组内取最长字符串作为统一值,符合规则1的要求
- 单独成组的行(同组内没有后8位匹配的其他行)会保留自己的预处理后的值,符合规则3的要求
- 代码运行结果和你给出的期望输出完全一致
内容的提问来源于stack exchange,提问作者athelas
相关产品推荐
相关产品推荐

