如何用Python实现Excel百万量级数据的列转行操作
处理百万级Excel数据:列转行(学生科目合并)
输入数据示例
StuId Name Subject 1 Adam French 1 Adam English 1 Adam Science 2 Jon Maths 2 Jon French
期望输出格式
StuId Name Subject_1 Subject_2 Subject_3 1 Adam French English Science 2 Jon Maths French
解决方案(基于Pandas,高效处理百万级数据)
Pandas的向量化操作天生适合处理大规模表格数据,比原生循环或轻量库效率高得多,还能有效控制内存占用。
安装依赖
先安装必要的工具库:pip install pandas openpyxl核心代码实现
import pandas as pd # 读取Excel:仅加载需要的列,避免冗余数据占用内存(百万级数据必做) df = pd.read_excel('input.xlsx', usecols=['StuId', 'Name', 'Subject']) # 按学生ID和姓名分组,把同一学生的科目聚合为列表 grouped_df = df.groupby(['StuId', 'Name'])['Subject'].agg(list).reset_index() # 将科目列表展开为多列,自动适配最多科目数的学生 max_subject_count = grouped_df['Subject'].str.len().max() subject_columns = [f'Subject_{i+1}' for i in range(max_subject_count)] grouped_df[subject_columns] = pd.DataFrame(grouped_df['Subject'].tolist(), index=grouped_df.index) # 整理最终结果:移除临时列表列,调整列顺序 final_df = grouped_df.drop('Subject', axis=1)[['StuId', 'Name'] + subject_columns] # 保存结果到Excel,用openpyxl引擎支持大文件写入 final_df.to_excel('output.xlsx', index=False, engine='openpyxl')
超大规模数据优化(内存不足时用)
如果数据量远超内存容量,可以分块读取+分步聚合:
# 分块读取Excel,每块10000行 chunk_iter = pd.read_excel('input.xlsx', usecols=['StuId', 'Name', 'Subject'], chunksize=10000) # 初始化空DataFrame存储中间聚合结果 aggregated = pd.DataFrame() for chunk in chunk_iter: # 对每个分块做分组聚合 chunk_group = chunk.groupby(['StuId', 'Name'])['Subject'].agg(list).reset_index() # 合并到总结果,重复学生ID需合并科目列表 aggregated = pd.concat([aggregated, chunk_group]).groupby(['StuId', 'Name'])['Subject'].agg(lambda x: sum(x, [])).reset_index() # 后续展开列、保存的步骤和之前一致
可选:合并科目为单个单元格
如果不需要拆分多列,而是用分隔符把科目合并成一个单元格(更省内存),可以修改聚合逻辑:
grouped_df = df.groupby(['StuId', 'Name'])['Subject'].agg(', '.join).reset_index() grouped_df.rename(columns={'Subject': 'Subjects'}, inplace=True) grouped_df.to_excel('output_single_col.xlsx', index=False, engine='openpyxl')
输出会变成:
StuId Name Subjects 1 Adam French, English, Science 2 Jon Maths, French
内容的提问来源于stack exchange,提问作者Anuj
相关产品推荐
相关产品推荐

