无法使用合并的单元格将多索引数据帧打印到 excel

Unable to print multiindex dataframe to excel with merged cells

我有一个数据框 df 如下所示:

Date        ConstraintType  Col1    Col2
2020-07-15  N-S             w1      521133
2020-07-15  N-S             w2      550260
2020-07-15  CSD             d1      522417
2020-07-15  CSD             d2      534542
2020-07-15  A               d4      534905
2020-07-15  B               d5      534904

dataframe的索引是:

df.index
Out[6]: 
MultiIndex([('2020-07-15',  'N-S'),
            ('2020-07-15',  'N-S'),
            ('2020-07-15',  'CSD'),
            ('2020-07-15',  'CSD'),
            ('2020-07-15', 'A'),
            ('2020-07-15', 'B')],
           names=['Date', 'ConstraintType'])

但是当我将其打印到 excel 时,它显示如下:

我期待以下内容:

我正在使用以下代码:

df.to_excel(r'C:\Users\ram\Desktop\z1.xlsx', merge_cells=True)

来自提供的 DataFrame:

  1. 使用.reset_index()从索引中删除索引列
  2. 使用 where.shift 将所有单元格值设置为空白,但 DateConstraintType 列中首次出现的值除外。
  3. 最后用.set_index把它们放回索引,这次只有一个不重复的值,写成to_excel现在merge_cells=True 应该可以

代码:

df=df.reset_index()
df['Date'] = df['Date'].where(df['Date'] != df['Date'].shift(), '')
df['ConstraintType'] = df['ConstraintType'].where(df['ConstraintType'] != df['ConstraintType'].shift(), '')
df = df.set_index(['Date', 'ConstraintType'])
df.to_excel(r'C:\Users\ram\Desktop\z1.xlsx', merge_cells=True)

excel 输出:

在pandas中最里面的索引必须标记每一行。 因此,必须手动处理最内层的索引,如@David Erickson 的回答所示。 Pandas 自动隐藏外部索引;见下面的例子:

import pandas as pd

tuples = [["2020-07-15", "N-S"],
          ["2020-07-15", "N-S"],
          ["2020-07-15", "CSD"],
          ["2020-07-15", "CSD"],
          ["2020-07-15", "A"],
          ["2020-07-15", "B"]
         ]

index = pd.MultiIndex.from_tuples(tuples, names=['Date', 'ConstraintType'])

df = pd.DataFrame([
    ["w1", 521133],
    ["w2", 550260],
    ["d1", 522417],
    ["d2", 534542],
    ["d4", 534905],
    ["d5", 534904],
], columns=["Col1", "Col2"],
   index=index
)

print(df, '\n'*2)
print(df.swaplevel(0,1))

Returns:

                          Col1    Col2
Date       ConstraintType             
2020-07-15 N-S              w1  521133
           N-S              w2  550260
           CSD              d1  522417
           CSD              d2  534542
           A                d4  534905
           B                d5  534904


                          Col1    Col2
ConstraintType Date                   
N-S            2020-07-15   w1  521133
               2020-07-15   w2  550260
CSD            2020-07-15   d1  522417
               2020-07-15   d2  534542
A              2020-07-15   d4  534905
B              2020-07-15   d5  534904

重置索引,清理以前的多索引列,然后保存到 Excel 而无需设置 merge_cells 选项:

df = df.reset_index(drop=False)
row_filt = df['ConstraintType'].eq(df['ConstraintType'].shift())
df.loc[row_filt, 'ConstraintType'] = ''
row_filt = df['Date'].eq(df['Date'].shift())
df.loc[row_filt, 'Date'] = ''

df.to_excel(r'C:\Users\ram\Desktop\z1.xlsx')

产生以下 Excel: