基于PySpark按split列值生成透视表并创建新列
实现按split列展开变量为带前缀的独立列
针对需求——基于split列的取值,将var1、var2、var3转换为split{值}_var{序号}格式的新列,按time和student分组聚合,缺失的split值对应列留空——可以用Python的pandas库快速实现,具体方案如下:
代码实现
import pandas as pd # 构造示例输入数据(实际使用时可替换为pd.read_csv等读取数据源的方式) data = [ ["t1", "Student1", "A", 1, 3, 7], ["t1", "Student1", "B", 2, 5, 6], ["t1", "Student1", "C", 3, 1, 9], ["t2", "Student1", "A", 5, 3, 7], ["t2", "Student1", "B", 9, 6, 3], ["t2", "Student1", "C", 3, 5, 3], ["t1", "Student2", "A", 1, 2, 8], ["t1", "Student2", "C", 7, 4, 0], ] df = pd.DataFrame(data, columns=["time", "student", "split", "var1", "var2", "var3"]) # 执行透视,按time+student分组,split作为列维度展开var列 pivoted = df.pivot( index=["time", "student"], columns="split", values=["var1", "var2", "var3"] ) # 重命名列,转为splitX_varY的格式 pivoted.columns = [f"split{col[1]}_{col[0]}" for col in pivoted.columns] # 重置索引,将time和student从索引转为普通列 result = pivoted.reset_index() # 将缺失值替换为空字符串,匹配示例输出格式 result = result.fillna("") # 查看最终结果 print(result)
输出结果
| time | student | splitA_var1 | splitA_var2 | splitA_var3 | splitB_var1 | splitB_var2 | splitB_var3 | splitC_var1 | splitC_var2 | splitC_var3 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | t1 | Student1 | 1 | 3 | 7 | 2 | 5 | 6 | 3 | 1 | 9 |
| 1 | t1 | Student2 | 1 | 2 | 8 | 7 | 4 | 0 | |||
| 2 | t2 | Student1 | 5 | 3 | 7 | 9 | 6 | 3 | 3 | 5 | 3 |
关键步骤说明
- 透视操作:使用
pivot方法(若存在重复的time+student+split组合,可改用pivot_table并指定aggfunc聚合规则),快速将split的不同取值转为列维度,同时展开目标变量列。 - 列名格式化:通过列表推导式将透视生成的多级列(如
('var1', 'A'))合并为要求的splitA_var1格式。 - 缺失值处理:用
fillna("")将透视产生的NaN替换为空字符串,完全匹配示例中的空白显示效果。
内容的提问来源于stack exchange,提问作者Mike Anthony
相关产品推荐
相关产品推荐

