Skip to content

Commit 96134ba

Browse files
committed
BUG: Excel writer doesn't handle "cols" option correctly
Added fix to ensure that Series associated with column names are handled correctly even if names are duplicated or swapped. Issue #5427
1 parent 3c57949 commit 96134ba

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

pandas/core/format.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,8 +1393,12 @@ def _format_regular_rows(self):
13931393
for idx, idxval in enumerate(index_values):
13941394
yield ExcelCell(self.rowcounter + idx, 0, idxval, header_style)
13951395

1396+
# Get a frame that will account for any duplicates in the column names.
1397+
col_mapped_frame = self.df.loc[:, self.columns]
1398+
1399+
# Write the body of the frame data series by series.
13961400
for colidx in range(len(self.columns)):
1397-
series = self.df.iloc[:, colidx]
1401+
series = col_mapped_frame.iloc[:, colidx]
13981402
for i, val in enumerate(series):
13991403
yield ExcelCell(self.rowcounter + i, colidx + coloffset, val)
14001404

@@ -1461,8 +1465,12 @@ def _format_hierarchical_rows(self):
14611465
header_style)
14621466
gcolidx += 1
14631467

1468+
# Get a frame that will account for any duplicates in the column names.
1469+
col_mapped_frame = self.df.loc[:, self.columns]
1470+
1471+
# Write the body of the frame data series by series.
14641472
for colidx in range(len(self.columns)):
1465-
series = self.df.iloc[:, colidx]
1473+
series = col_mapped_frame.iloc[:, colidx]
14661474
for i, val in enumerate(series):
14671475
yield ExcelCell(self.rowcounter + i, gcolidx + colidx, val)
14681476

pandas/io/tests/test_excel.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -922,11 +922,25 @@ def test_duplicated_columns(self):
922922
write_frame.columns = colnames
923923
write_frame.to_excel(path, 'test1')
924924

925-
read_frame = read_excel(path, 'test1').astype(np.int64)
925+
read_frame = read_excel(path, 'test1')
926926
read_frame.columns = colnames
927927

928928
tm.assert_frame_equal(write_frame, read_frame)
929929

930+
def test_swapped_columns(self):
931+
# Test for issue #5427.
932+
_skip_if_no_xlrd()
933+
934+
with ensure_clean(self.ext) as path:
935+
write_frame = DataFrame({'A': [1, 1, 1],
936+
'B': [2, 2, 2]})
937+
write_frame.to_excel(path, 'test1', cols=['B', 'A'])
938+
939+
read_frame = read_excel(path, 'test1', header=0)
940+
941+
tm.assert_series_equal(write_frame['A'], read_frame['A'])
942+
tm.assert_series_equal(write_frame['B'], read_frame['B'])
943+
930944

931945
class OpenpyxlTests(ExcelWriterBase, unittest.TestCase):
932946
ext = '.xlsx'

0 commit comments

Comments
 (0)