When saving a pandas dataframe to csv how do I retain the columns.name?
Solution 1
You can pass a list to name the columns, then you can specify the index name when you are writing to csv:
df.columns = ['column_name1', 'column_name2', 'column_name3']
df.to_csv('/path/to/file.csv', index_label='Index_name')
Solution 2
How about this? It's slightly different but hopefully usable, since it fits the CSV paradigm:
>>> df.columns = ['y{}'.format(name) for name in df.columns]
>>> df.to_csv('output.csv')
>>> print open('output.csv').read()
x,y0,y1,y2,y3
0,3.5,1.5,1.6,0.3
1,7.0,4.7,6.5,5.2
2,6.6,7.6,3.2,5.5
3,4.0,2.8,7.1,7.8
SimonBiggs
Updated on July 17, 2022Comments
-
SimonBiggs almost 2 years
Initial Problem
When I run the following in ipython
import numpy as np import pandas as pd df = pd.DataFrame(np.round(9*np.random.rand(4,4), decimals=1)) df.index.name = 'x' df.columns.name = 'y' df.to_csv('output.csv') df
it outputs the following result:
y 0 1 2 3 x 0 7.6 7.4 0.3 7.5 1 5.6 0.0 1.5 5.9 2 7.1 2.1 0.0 0.9 3 3.7 6.6 3.3 8.4
However when I open
output.csv
the "y" is removed:x 0 1 2 3 0 7.6 7.4 0.3 7.5 1 5.6 0 1.5 5.9 2 7.1 2.1 0 0.9 3 3.7 6.6 3.3 8.4
How do I make it so that the
df.columns.name
is retained when I output the dataframe to csv?Crude workaround
Current crude work-around is me doing the following:
df.to_csv('output.csv', index_label = 'x|y')
Which results in
output.csv
reading:x|y 0 1 2 3 0 7.6 7.4 0.3 7.5 1 5.6 0 1.5 5.9 2 7.1 2.1 0 0.9 3 3.7 6.6 3.3 8.4
Something better would be great! Thanks for your help (in advance).
Context
This is what I am working on: https://github.com/SimonBiggs/Electron-Cutout-Factors
This is an example table: https://github.com/SimonBiggs/Electron-Cutout-Factors/blob/master/output/20140807_173714/06app06eng/interpolation-table.csv
-
SimonBiggs over 9 yearsThanks for the offer, unfortunately that doesn't meet my needs. I care about the numbers that are written in the columns and index.
-
John Zwinck over 9 yearsCan you be more specific about what problem my solution causes you? It seems like what you're asking for will otherwise require you to write your own header rows before asking Pandas to write the body of the CSV. You can do that if you really need to.
-
SimonBiggs over 9 yearsFirst: I want the code to be as readable and transparent as possible. So minimal complication is important. Second: I am creating a look-up table to be used for interpolation. The axes represent "width" and "aspect ratio", hence the headings. The full code can be seen at my gihtub here. An example of one of these interpolation tables can be seen here.
-
John Zwinck over 9 yearsI think your "crude workaround" is as good as you're likely to get.
-
SimonBiggs over 9 yearsOkay, thanks John. Also, for future readers, the table link has changed. An example table should now be able to be found here