如何根据Group ID将单列人员数据拆分为多列,实现行转列效果?
可行实现方案
你这个场景本质是给同组内的成员按顺序编号,再按编号转成列,不需要用常规的行转列/列转行逻辑,下面给不同工具的实现方法:
1. SQL 实现(通用标准语法)
先给同组的每个人加行号,再做条件聚合即可,示例代码:
WITH ranked_people AS ( SELECT People, `Group ID`, ROW_NUMBER() OVER (PARTITION BY `Group ID` ORDER BY People) AS rn FROM your_table ) SELECT MAX(CASE WHEN rn = 1 THEN People END) AS `People 1`, MAX(CASE WHEN rn = 2 THEN People END) AS `People 2`, `Group ID` FROM ranked_people GROUP BY `Group ID`
- 逻辑说明:先用窗口函数给每个组内的成员打1、2的序号,再通过条件聚合把序号1的放到People1列,序号2的放到People2列即可,完全适配每组固定2人的场景。
2. Excel/Power Query 实现
操作步骤:
- 把数据加载到Power Query编辑器,选中「Group ID」列,点击【分组依据】
- 分组设置:新列名输入「temp」,操作选「所有行」,点击确定
- 新增自定义列,公式输入:
Table.FromList([temp][People],Splitter.SplitByNothing(),{"Item"}) - 展开自定义列的表格,给分组内加索引列:选中自定义列的表格,点击【添加列】-【索引列】- 从1开始
- 透视索引列:选中索引列,点击【转换】-【透视列】,值列选People,聚合函数选不要聚合
- 最后把列重命名为People 1、People 2即可
3. Python Pandas 实现
代码示例:
import pandas as pd # 先给同组加序号 df['rn'] = df.groupby('Group ID').cumcount() + 1 # 透视表输出 res = df.pivot(index='Group ID', columns='rn', values='People').reset_index() # 重命名列 res.columns = ['Group ID', 'People 1', 'People 2']
逻辑和SQL方案一致,处理十万行级数据也没有性能问题。
内容的提问来源于stack exchange,提问作者Larsen
相关产品推荐
相关产品推荐

