无法使用合并的单元格将多索引数据帧打印到 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:
- 使用
.reset_index()
从索引中删除索引列
- 使用
where
和 .shift
将所有单元格值设置为空白,但 Date
和 ConstraintType
列中首次出现的值除外。
- 最后用
.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:
我有一个数据框 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:
- 使用
.reset_index()
从索引中删除索引列 - 使用
where
和.shift
将所有单元格值设置为空白,但Date
和ConstraintType
列中首次出现的值除外。 - 最后用
.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: