如何在 Pandas 中拆分列标题并正确导出到 Excel

Posted

技术标签:

【中文标题】如何在 Pandas 中拆分列标题并正确导出到 Excel【英文标题】:How to split column header in Pandas and export to Excel properly 【发布时间】:2017-09-18 11:23:04 【问题描述】:

我在 Pandas 中有以下数据头:

我正在努力得到以下结果:

我试图执行一个命令:

df = df.reorder_levels([0, 1, 3, 2], axis='columns')

但是,它只是对行进行重新排序,我认为这里存在破坏数据一致性的风险。

你能建议 pandas/pythonic 的方法吗?或者我应该检查哪些选项才能正确导出到 Excel(如图 2 所示)?

【问题讨论】:

我认为这只是 MultiIndex 的默认可视化 - 检查this,findIn [20]: pd.set_option('display.multi_sparse', False) 是的,它适用于 Jupyter 中的可视化,但是当您导出到 Excel 时,问题仍然相同。有什么想法吗? 【参考方案1】:

我最近遇到了这个问题,发现了另一个肮脏但更容易破解的方法。

只要第一个标题行具有不同的值,df.to_excel 就会将后续的标题行保存为单独的值。因此,在设置标题时,将第一行设为唯一字符并在其余代码中忽略它。

没有唯一的第一个标题行:

df1 =  pd.DataFrame(columns=[['APPROACH #1', 'APPROACH #1', 'APPROACH #1', 'APPROACH #1', 'APPROACH #1'],
                         ['CODE', 'CODE', 'CODE', 'CODE', 'CODE'],
                         ['GLMNET', 'HYBER', 'LightGBM', 'XGB_1', 'XGB_2']])

Image of df1 result with merged header values

具有唯一的第一个标题行:

df2 =  pd.DataFrame(columns=[[1, 2, 3, 4, 5],
                         ['APPROACH #1', 'APPROACH #1', 'APPROACH #1', 'APPROACH #1', 'APPROACH #1'],
                         ['CODE', 'CODE', 'CODE', 'CODE', 'CODE'],
                         ['GLMNET', 'HYBER', 'LightGBM', 'XGB_1', 'XGB_2']])

Image of df2 result with separate header values

希望这会有所帮助!

【讨论】:

【参考方案2】:

我认为您只能使用一些 hack 解决方案 - 从列中的 MultiIndex 创建助手 df,然后在不带标题的情况下写入 excel

np.random.seed(100)
cols = pd.MultiIndex.from_product([list('ABC'), list('EF')])
df = pd.DataFrame(np.random.random((1,6)), columns=cols)
print (df)
          A                   B                   C          
          E         F         E         F         E         F
0  0.543405  0.278369  0.424518  0.844776  0.004719  0.121569

df1 = pd.DataFrame(df.columns.values.tolist()).T
df1.columns.name = None
df1.index = [''] * len(df1.index)
print (df1)
  0  1  2  3  4  5
  A  A  B  B  C  C
  E  F  E  F  E  F

df.columns = np.arange(len(df.columns))
df = pd.concat([df1, df])
print (df)
          0         1         2         3           4         5
          A         A         B         B           C         C
          E         F         E         F           E         F
0  0.543405  0.278369  0.424518  0.844776  0.00471886  0.121569

df.to_excel('myfile.xlsx', header=None)

双转置的另一种解决方案:

df1 = df.T.rename_axis(['',' ']).reset_index().T
print (df1)
          0         1         2         3           4         5
          A         A         B         B           C         C
          E         F         E         F           E         F
0  0.543405  0.278369  0.424518  0.844776  0.00471886  0.121569

df.to_excel('myfile.xlsx', header=None)

【讨论】:

以上是关于如何在 Pandas 中拆分列标题并正确导出到 Excel的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - 出现字符串时拆分数据并创建列

pandas 将excel中的一列文本数据拆分成多列 如何操作

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列dataframe并添加到原dataframe中drop函数基于数据列名称删除列

Pandas 导出到 Excel 并设置自适应列宽

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数设置expand参数将拆分结果列表内容转化为多列dataframe并添加到原dataframe中

Pandas:通过分隔符拆分列并根据其他列重新排列