如何将Pandas问卷宽表转置为标准化长表以存入SQL Server数据库
宽表转标准化长表实现方案
一、Pandas 实现(推荐,适配大规模数据场景)
Pandas 内置的转换方法做了底层优化,就算后续数据增长到十万、百万行级别也能高效处理,是最适配你场景的方案。
方法1:melt 函数(官方推荐宽转长专用API)
melt 就是专门用来做宽表转长表的工具,参数配置简单直观:
import pandas as pd # 实际使用时替换为你从Sharepoint下载得到的DataFrame即可 df = pd.DataFrame({ 'ID': [1,2,3,4], 'Q1': [1,1,0,0], 'Q2': [1,1,0,1], 'QN': [0,1,1,0] }) # 宽转长核心代码 long_df = df.melt( id_vars=["ID"], # 保留不变的主键列 var_name="Question", # 原列名转换后存储的字段名 value_name="Answer" # 原单元格值转换后存储的字段名 ).sort_values(by="ID").reset_index(drop=True) # 验证输出 print(long_df)
优势:
- 代码简洁,逻辑清晰,后续维护成本极低
- 底层做了向量化优化,50+列、数十万行数据转换耗时也在毫秒级
- 自动保留原数据类型,不需要额外做类型校验
方法2:stack 层级索引实现
通过设置索引后堆叠列的方式也能实现相同效果:
long_df = df.set_index("ID").stack().reset_index() long_df.columns = ["ID", "Question", "Answer"]
二、原生Python实现(无需第三方依赖)
如果你所处环境不能安装Pandas,可使用原生Python的列表、字典实现,适合小批量数据场景:
# 样例输入,替换为你实际拿到的原始数据即可 raw_data = [ {"ID":1, "Q1":1, "Q2":1, "QN":0}, {"ID":2, "Q1":1, "Q2":1, "QN":1}, {"ID":3, "Q1":0, "Q2":0, "QN":1}, {"ID":4, "Q1":0, "Q2":1, "QN":0} ] result = [] for row in raw_data: id_val = row["ID"] # 遍历所有非ID列,生成对应行 for col_name in row: if col_name != "ID": result.append({ "ID": id_val, "Question": col_name, "Answer": row[col_name] }) # 验证输出 for item in result: print(item)
如果你的原始数据是列表嵌套列表的格式(比如从文件逐行读取的结果),可调整为以下逻辑:
raw_data = [ ["ID", "Q1", "Q2", "QN"], [1,1,1,0], [2,1,1,1], [3,0,0,1], [4,0,1,0] ] headers = raw_data[0] id_index = headers.index("ID") question_cols = [col for col in headers if col != "ID"] result = [] for row in raw_data[1:]: id_val = row[id_index] for q_col in question_cols: q_index = headers.index(q_col) result.append([id_val, q_col, row[q_index]])
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

