如何在Pandas的DataFrame.to_csv()中保留列索引名称?
Pandas导出CSV时如何保留列索引名称?
当使用Pandas的dataframe.to_csv()导出带有列索引名称的DataFrame时,默认不会保留列索引的名称。以下是具体场景和解决方案:
问题场景示例
import pandas as pd # 读取鸢尾花数据集 iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv') # 创建透视表,列索引名称为sepal_length pivot_iris = iris.pivot_table(index='species', columns='sepal_length', values='sepal_width') print(pivot_iris.columns) print(pivot_iris) # 默认导出CSV pivot_iris.to_csv('pivot_iris.csv', index=True, header=True)
透视后的DataFrame列索引名称为sepal_length,从打印结果可见:
Index([4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.6, 7.7, 7.9], dtype='float64', name='sepal_length')
DataFrame显示效果:
sepal_length 4.3 4.4 4.5 4.6 4.7 ... 7.3 7.4 7.6 7.7 7.9 species ... setosa 3.0 3.033333 2.3 3.325 3.2 ... NaN NaN NaN NaN NaN versicolor NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN virginica NaN NaN NaN NaN NaN ... 2.9 2.8 3.0 3.05 3.8 [3 rows x 35 columns]
但默认导出的CSV中缺失了列索引名称sepal_length,内容如下:
species,4.30,4.40,4.50,4.60,4.70,4.80,4.90,5.00,5.10,5.20,5.30,5.40,5.50,5.60,5.70,5.80,5.90,6.00,6.10,6.20,6.30,6.40,6.50,6.60,6.70,6.80,6.90,7.00,7.10,7.20,7.30,7.40,7.60,7.70,7.90 setosa,3.00,3.03,2.30,3.33,3.20,3.18,3.20,3.36,3.60,3.67,3.70,3.66,3.85,,4.10,4.00,,,,,,,,,,,,,,,,,,, versicolor,,,,,,,2.40,2.15,2.50,2.70,,3.00,2.44,2.82,2.82,2.67,3.10,2.80,2.88,2.55,2.70,3.05,2.80,2.95,3.07,2.80,3.10,3.20,,,,,,, virginica,,,,,,,2.50,,,,,,,2.80,2.50,2.73,3.00,2.60,2.80,3.10,2.93,2.92,3.05,,3.04,3.10,3.13,,3.00,3.27,2.90,2.80,3.00,3.05,3.80
解决方案
方法1:将列索引转换为多层索引
把原列索引的名称作为多层索引的第一层,原列值作为第二层,导出时会自动保留该名称:
import pandas as pd iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv') pivot_iris = iris.pivot_table(index='species', columns='sepal_length', values='sepal_width') # 转换为多层列索引 pivot_iris.columns = pd.MultiIndex.from_tuples( [(pivot_iris.columns.name, col) for col in pivot_iris.columns] ) # 导出CSV pivot_iris.to_csv('pivot_iris.csv', index=True)
导出后的CSV表头包含两行,第一行即为列索引名称:
,sepal_length,sepal_length,sepal_length,... species,4.30,4.40,4.50,...
方法2:手动指定header参数
直接在to_csv的header参数中传入列索引名称的重复列表,模拟多层表头效果:
pivot_iris.to_csv( 'pivot_iris.csv', index=True, header=[pivot_iris.columns.name] * len(pivot_iris.columns) )
效果与方法1一致,表头第一行会重复显示列索引名称。
方法3:手动写入表头和数据
如果需要更灵活的格式控制,可以先手动写入包含列索引名称的表头,再写入DataFrame数据:
with open('pivot_iris.csv', 'w') as f: # 写入第一行表头:第一列为空(对应行索引列),后续列均为sepal_length header_line = ',' + ','.join([pivot_iris.columns.name] * len(pivot_iris.columns)) + '\n' f.write(header_line) # 写入DataFrame数据(包含行索引) pivot_iris.to_csv(f, index=True)
内容的提问来源于stack exchange,提问作者voiDnyx
相关产品推荐
相关产品推荐

