我正在尝试将 pandas 数据框输出到 Excel 中。该数据框具有列和行的多重索引。为了了解这个数据帧的结构,我将分别在第一张和第二张图片上附加一些列索引(因为它很长)和行索引。正如您所看到的,出现了一些合并的单元格,但这是不希望的。你会说我可以使用这个选项:
df.to_excel('output.csv', merge_cells=False)
但这将以如下格式连接列:2024.1.2、2024.1.3、2024.1.4 等。在单个列级别中(而不是像现在一样具有 3 个列级别,即“2024”第一级, “1”第二级,[“2”、“3”、“4”]第三级)。我想保留这三个级别,但每列重复 2024,而不是合并单元格。
我也尝试过
df.T.reset_index().T
但这并不能解决我的问题,因为列将成为表格的一部分,这也是不需要的,因为它将获取我给出的表格格式,并且不会像标题那样采用粗体和居中格式他们应该是。
我期待这样的输出:
我相信及时有人会指出我错过的选项,比如
sparsify=False
,如 DataFrame.to_html。同时,我建议用这种方法来解决问题。
我们可以在最顶层放置唯一的数字,以强制编写者区分每一列并编写较低级别而不合并。让我们看看它是如何工作的:
from pandas import MultiIndex, DataFrame, ExcelWriter
columns = MultiIndex.from_product([[2024],[*'AB'],[*'xy']])
data = [[*range(columns.size)]]
df = DataFrame(data, columns=columns)
# 2024
# A B
# x y x y
# 0 0 1 2 3
# put a unique number at the top of each columns
enum_cols = MultiIndex.from_arrays(
[range(df.columns.size), *zip(*df.columns)]
)
# prepare a writer for removing column number in the end
file, sheet = 'test_multicolumn.xlsx', 'Sheet1'
writer = ExcelWriter(file, engine='openpyxl')
# replace columns with their numbered version and save to excel
df.set_axis(enum_cols, axis='columns').to_excel(writer, sheet)
# remove the level of column numbers, save and close
writer.sheets[sheet].delete_rows(1)
writer.close()
现在数据在每列中都带有标题保存。请注意,
style.hide(axis='columns', level=0)
的技巧会被 to_excel
忽略,因此我们需要编写者删除带有数字的上行(或者我们稍后在 Excel 中手动删除它)。