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

使用Pandas将两个标识符列表合并为单列

解决Pandas多ID列拆分到单独行的问题

嘿,刚接触Pandas就碰到这种数据清理的场景太正常了!我来带你一步步把这个问题搞定,让你的DataFrame能顺利和另一个表合并。

首先先补全你提到的示例数据(模拟真实场景加了点空值):

import pandas as pd
import numpy as np
data = pd.DataFrame({
    "Name":["Bob", "Mary"], 
    "Age":[50,55],
    "ID1":["1,2,3", "6,7"],
    "ID2":["4,5", np.nan]
})

我们的目标是把每个ID列里的ID列表拆成单独的行,同时保留对应的Name和Age信息,具体步骤如下:

步骤1:把ID字符串转成列表

先把所有ID列里的逗号分隔字符串拆成Python列表,同时处理空值(避免后续explode出错):

# 先筛选出所有以ID开头的列
id_columns = [col for col in data.columns if col.startswith('ID')]

# 遍历每个ID列,拆分字符串并替换空值为列表
for col in id_columns:
    data[col] = data[col].str.split(',').replace(np.nan, [])

步骤2:合并多ID列为单列(融化数据)

用melt方法把多个ID列整合到一列里,同时保留Name和Age作为标识:

melted_data = data.melt(
    id_vars=['Name', 'Age'],  # 要保留的非ID列
    value_vars=id_columns,    # 需要合并的ID列
    var_name='ID_Source',     # 可选:记录这个ID来自哪个原列(比如ID1/ID2)
    value_name='IDs'          # 新的ID列表列名
)

步骤3:拆分ID列表到单独行

最后用explode把每个列表里的ID拆成单独的行,再过滤掉空行:

final_data = melted_data.explode('IDs').dropna(subset=['IDs']).reset_index(drop=True)

# 可选:把ID转为整数类型(如果你的ID是数字的话)
final_data['IDs'] = final_data['IDs'].astype(int)

现在你打印final_data就能得到想要的结果:

Name  Age ID_Source  IDs
0    Bob   50       ID1    1
1    Bob   50       ID1    2
2    Bob   50       ID1    3
3    Bob   50       ID2    4
4    Bob   50       ID2    5
5   Mary   55       ID1    6
6   Mary   55       ID1    7

额外小提示

  • 如果你的ID分隔符不是逗号,只要修改str.split(',')里的参数就行(比如分号就改成str.split(';'))
  • 如果不需要记录ID来自哪个原列,可以去掉var_name='ID_Source'这个参数
  • 如果你的数据里没有空值,那replace(np.nan, [])这一步可以省略

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:45:19