You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含列表的DataFrame写入Excel并使列表元素分占独立单元格?

如何将DataFrame中列表形式的重复数据拆分到Excel相邻单元格?

问题背景

现有如下结构的DataFrame,其中Data列以列表形式存储重复数据,经过pivot转换后得到宽表:

import pandas as pd

d = {'Compound': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C'],
     'Conc': [1, 0.5, 0.1, 1, 0.5, 0.1, 2, 1, 0.5, 0.1],
     'Data': [[100, 90, 80], [50, 40, 30], [10, 9.7, 8], 
              [20, 15, 10], [3, 4, 5, 6], [100, 110, 80],
              [30, 40, 50, 20], [10, 5, 9, 3], [2, 1, 2, 2], [1, 1, 0]]}

df = pd.DataFrame(data=d)
pivoted = df.pivot(index='Conc', columns='Compound', values='Data')

直接用to_excel导出时,每个单元格会显示完整的列表(如[100,90,80]),而我们需要将列表中的每个元素拆分到同一行的相邻独立单元格,同时保持Compound的表头对应并合并。

解决方案

步骤1:拆分列表数据为多列

先将每个Compound列下的列表拆分为多个子列,构建多级列索引的DataFrame:

# 拆分每个Compound列的列表为多列
expanded = []
for col in pivoted.columns:
    # 将列表拆分为多个列,用(Compound名称, 序号)作为列名
    col_expanded = pivoted[col].apply(pd.Series).rename(columns=lambda x: (col, x+1))
    expanded.append(col_expanded)

# 合并所有拆分后的列
final_df = pd.concat(expanded, axis=1)
# 转换为多级列索引
final_df.columns = pd.MultiIndex.from_tuples(final_df.columns)

步骤2:写入Excel并设置表头合并

使用openpyxl引擎写入Excel,同时合并Compound对应的表头单元格:

from openpyxl.styles import Alignment

with pd.ExcelWriter('output.xlsx', engine='openpyxl') as writer:
    final_df.to_excel(writer, sheet_name='Sheet1', index_label='Conc')
    worksheet = writer.sheets['Sheet1']
    
    # 遍历每个Compound,合并对应的表头单元格
    current_col = 2  # 从第二列开始(第一列为Conc列)
    for compound in final_df.columns.get_level_values(0).unique():
        # 获取当前Compound对应的子列数量
        col_num = len(final_df.columns[final_df.columns.get_level_values(0) == compound])
        # 合并第一行的表头单元格
        worksheet.merge_cells(start_row=1, start_column=current_col, 
                              end_row=1, end_column=current_col + col_num -1)
        # 设置合并后单元格的居中对齐
        header_cell = worksheet.cell(row=1, column=current_col)
        header_cell.value = compound
        header_cell.alignment = Alignment(horizontal='center')
        # 更新当前列位置
        current_col += col_num
    
    # 可选:隐藏第二行的子列序号(如果不需要显示)
    # worksheet.row_dimensions[2].hidden = True

执行上述代码后,Excel文件会呈现期望效果:每个Compound表头跨列合并,列表中的每个元素被写入同一行的相邻独立单元格。

内容的提问来源于stack exchange,提问作者John Crow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:05:22