如何在Pandas DataFrame中将多列ID转换为单列多行结构
解决方案
你需要的是典型的宽表转长表操作,不需要使用transform函数,Pandas内置的melt或者explode方法都可以快速实现需求:
方法1:使用melt函数(兼容性最好,所有Pandas版本支持)
首先构造示例数据:
import pandas as pd df = pd.DataFrame({ 'uri': ['aaa', 'bbb'], 'ID1': [1, 4], 'ID2': [2, 5], 'ID3': [3, 6] })
执行转换操作:
res = df.melt( id_vars='uri', # 保留不变的索引列 value_vars=['ID1', 'ID2', 'ID3'], # 需要展开的ID列 value_name='IDs' # 展开后值对应的列名 ).drop('variable', axis=1) # 删掉不需要的原ID列名列 # 如果需要按uri排序可以加上这行 res = res.sort_values('uri', ignore_index=True)
方法2:使用explode函数(更简洁,Pandas 1.1.0及以上版本支持)
# 先把多列ID合并为列表类型的列 df['IDs'] = df[['ID1', 'ID2', 'ID3']].values.tolist() # 炸开列表列得到长表 res = df[['uri', 'IDs']].explode('IDs', ignore_index=True)
两种方法输出的结果都符合预期:
| uri | IDs |
|---|---|
| aaa | 1 |
| aaa | 2 |
| aaa | 3 |
| bbb | 4 |
| bbb | 5 |
| bbb | 6 |
补充说明:transform函数的作用是对分组后的数据做同长度的转换返回,不会改变原表的行数,所以不适合这种行倍增的展开场景。
内容的提问来源于stack exchange,提问作者user11866342
相关产品推荐
相关产品推荐

