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

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>

和给出的期望结果完全一致,是Pandas支持空值的整数类型标识,和NaN效果一致。

自定义调整说明

  • 修改匹配位数:调整prefix_len的数值即可
  • 修改匹配规则:如果需要按后缀、中间指定位数匹配,修改切片逻辑即可,比如取后3位匹配把str[:prefix_len]改成str[-prefix_len:]

内容的提问来源于stack exchange,提问作者Duy Pham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:15:00