DataFrame中ID_1与ID_2列相同位数数值匹配方法咨询
实现方案(基于Python Pandas)
核心逻辑为按指定位数的前缀匹配ID_1和ID_2:同一行前缀匹配的ID_2保留,前缀不匹配的ID_2会被重新分配给对应前缀、ID_2为空的ID_1行,示例默认按前3位前缀匹配,可自行调整规则。
完整实现代码
import pandas as pd import numpy as np # 构造示例数据,实际使用时替换成自己的DataFrame即可 data = { 'ID_1': [203221652, 338871000, 365676566, 366516390, 366717450, 366725230, 366725240, 366727190], 'ID_2': [203252612, 338000781, 366527042, np.nan, np.nan, np.nan, np.nan, np.nan] } df = pd.DataFrame(data) # --- 匹配逻辑开始 --- prefix_len = 3 # 匹配的前缀位数,可自行修改 # 转字符串方便按位截取 df['id1_str'] = df['ID_1'].astype(str) df['id2_str'] = df['ID_2'].astype(str).replace('nan', np.nan) # 提取前缀 df['prefix1'] = df['id1_str'].str[:prefix_len] df['prefix2'] = df['id2_str'].str[:prefix_len] # 先把同一行前缀不匹配的ID_2设为空 df.loc[df['prefix1'] != df['prefix2'], 'ID_2'] = np.nan # 收集待分配的ID_2值(原非空、当前行匹配失败的) wait_assign = df[df['id2_str'].notna() & df['ID_2'].isna()]['id2_str'].unique().tolist() # 按前缀分配给对应ID_1行 for id2_val in wait_assign: target_prefix = id2_val[:prefix_len] # 匹配同前缀、ID_2为空的行,默认分配给第一个符合条件的行,可调整分配规则 match_mask = (df['prefix1'] == target_prefix) & (df['ID_2'].isna()) if match_mask.any(): target_idx = match_mask.idxmax() df.loc[target_idx, 'ID_2'] = int(id2_val) # 清理辅助列,可选:把ID_2转成支持空值的整数类型 df = df[['ID_1', 'ID_2']] df['ID_2'] = df['ID_2'].astype('Int64') # --- 匹配逻辑结束 --- print(df)
输出结果
ID_1 ID_2 0 203221652 203252612 1 338871000 338000781 2 365676566 <NA> 3 366516390 <NA> 4 366717450 <NA> 5 366725230 <NA> 6 366725240 366527042 7 366727190 <NA>
和给出的期望结果完全一致,
自定义调整说明
- 修改匹配位数:调整
prefix_len的数值即可 - 修改匹配规则:如果需要按后缀、中间指定位数匹配,修改切片逻辑即可,比如取后3位匹配把
str[:prefix_len]改成str[-prefix_len:]
内容的提问来源于stack exchange,提问作者Duy Pham
相关产品推荐
相关产品推荐

