Skip to content

Commit 791e704

Browse files
Chang Shewesm
Chang She
authored andcommitted
ENH: column aliases for to_csv/to_excel #921
1 parent 07e4ecd commit 791e704

File tree

2 files changed

+41
-9
lines changed

2 files changed

+41
-9
lines changed

pandas/core/frame.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,8 @@ def to_panel(self):
10241024

10251025
to_wide = deprecate('to_wide', to_panel)
10261026

1027-
def _helper_csvexcel(self, writer, na_rep=None, cols=None, header=True,
1027+
def _helper_csvexcel(self, writer, na_rep=None, cols=None,
1028+
col_aliases=None, header=True,
10281029
index=True, index_label=None):
10291030
if cols is None:
10301031
cols = self.columns
@@ -1053,7 +1054,15 @@ def _helper_csvexcel(self, writer, na_rep=None, cols=None, header=True,
10531054
index_label = [index_label]
10541055

10551056
encoded_labels = list(index_label)
1056-
encoded_cols = list(cols)
1057+
if col_aliases is not None:
1058+
if len(col_aliases) != len(cols):
1059+
raise ValueError(('Writing %d cols but got %d aliases'
1060+
% (len(cols), len(col_aliases))))
1061+
else:
1062+
write_cols = col_aliases
1063+
else:
1064+
write_cols = cols
1065+
encoded_cols = list(write_cols)
10571066

10581067
writer.writerow(encoded_labels + encoded_cols)
10591068
else:
@@ -1078,8 +1087,8 @@ def _helper_csvexcel(self, writer, na_rep=None, cols=None, header=True,
10781087
writer.writerow(row_fields)
10791088

10801089
def to_csv(self, path_or_buf, sep=",", na_rep='', cols=None,
1081-
header=True, index=True, index_label=None, mode='w',
1082-
nanRep=None, encoding=None):
1090+
col_aliases=None, header=True, index=True, index_label=None,
1091+
mode='w', nanRep=None, encoding=None):
10831092
"""
10841093
Write DataFrame to a comma-separated values (csv) file
10851094
@@ -1091,6 +1100,8 @@ def to_csv(self, path_or_buf, sep=",", na_rep='', cols=None,
10911100
Missing data representation
10921101
cols : sequence, optional
10931102
Columns to write
1103+
col_aliases : sequence, default None
1104+
Optional column aliases to be written instead of column names
10941105
header : boolean, default True
10951106
Write out column names
10961107
index : boolean, default True
@@ -1126,14 +1137,16 @@ def to_csv(self, path_or_buf, sep=",", na_rep='', cols=None,
11261137
else:
11271138
csvout = csv.writer(f, lineterminator='\n', delimiter=sep)
11281139
self._helper_csvexcel(csvout, na_rep=na_rep, cols=cols,
1129-
header=header, index=index,
1130-
index_label=index_label)
1140+
col_aliases=col_aliases, header=header,
1141+
index=index, index_label=index_label)
1142+
11311143
finally:
11321144
if close:
11331145
f.close()
11341146

11351147
def to_excel(self, excel_writer, sheet_name='sheet1', na_rep='',
1136-
cols=None, header=True, index=True, index_label=None):
1148+
cols=None, col_aliases=None, header=True, index=True,
1149+
index_label=None):
11371150
"""
11381151
Write DataFrame to a excel sheet
11391152
@@ -1173,8 +1186,8 @@ def to_excel(self, excel_writer, sheet_name='sheet1', na_rep='',
11731186
need_save = True
11741187
excel_writer.cur_sheet = sheet_name
11751188
self._helper_csvexcel(excel_writer, na_rep=na_rep, cols=cols,
1176-
header=header, index=index,
1177-
index_label=index_label)
1189+
col_aliases=col_aliases, header=header,
1190+
index=index, index_label=index_label)
11781191
if need_save:
11791192
excel_writer.save()
11801193

pandas/tests/test_frame.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3100,6 +3100,16 @@ def test_to_csv_from_csv(self):
31003100
result = DataFrame.from_csv(path, index_col=[0, 1, 2],
31013101
parse_dates=False)
31023102
assert_frame_equal(result, df)
3103+
3104+
# column aliases
3105+
col_aliases = Index(['AA', 'X', 'Y', 'Z'])
3106+
self.frame2.to_csv(path, header=True, col_aliases=col_aliases)
3107+
rs = DataFrame.from_csv(path)
3108+
xp = self.frame2.copy()
3109+
xp.columns = col_aliases
3110+
3111+
assert_frame_equal(xp, rs)
3112+
31033113
os.remove(path)
31043114

31053115
def test_to_csv_multiindex(self):
@@ -3284,6 +3294,15 @@ def test_to_excel_from_excel(self):
32843294
np.testing.assert_equal('test1', reader.sheet_names[0])
32853295
np.testing.assert_equal('test2', reader.sheet_names[1])
32863296

3297+
# column aliases
3298+
col_aliases = Index(['AA', 'X', 'Y', 'Z'])
3299+
self.frame2.to_excel(path, 'test1', header=True,
3300+
col_aliases=col_aliases)
3301+
reader = ExcelFile(path)
3302+
rs = reader.parse('test1')
3303+
xp = self.frame2.copy()
3304+
xp.columns = col_aliases
3305+
assert_frame_equal(xp, rs)
32873306

32883307
os.remove(path)
32893308

0 commit comments

Comments
 (0)