使用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
相关产品推荐
相关产品推荐

