如何在pandas DataFrame中存储行和列索引的名称?

时间:2016-01-27 20:57:46

标签: python pandas

我有一个DataFrame 名为的行和列索引:

import numpy as np
import pandas as pd

I = pd.Index(["a", "b", "c", "d"], name="rows")
C = pd.Index(["col0", "col1", "col2"], name="cols")
df = pd.DataFrame(data=np.random.rand(4, 3),
                  index=I,
                  columns=C)

我曾尝试将其存储为多种格式(Excel,CSV),但在重新读取文件时,名称会丢失(可能我错过了一些选项)。 Msgpack有效,但标记为实验性,所以我宁愿暂时避免使用它。我也希望避免pickle。是否有任何方式(格式和选项)来存储2个索引的名称?

修改 我知道如何使用pandas编写和读取CSV。问题是保存列索引和行索引的名称。

4 个答案:

答案 0 :(得分:6)

您可以使用hdf。

import numpy as np
import pandas as pd
I = pd.Index(["a", "b", "c", "d"], name="rows")
C = pd.Index(["col0", "col1", "col2"], name="columns")
df = pd.DataFrame(data=np.random.rand(4,3), index=I, columns=C)
print(df)

columns      col0      col1      col2
rows                                 
a        0.098497  0.918954  0.642800
b        0.168266  0.678434  0.455059
c        0.434939  0.244027  0.599400
d        0.877356  0.053085  0.182661

df.to_hdf('test.hdf', 'test')
print(pd.read_hdf('test.hdf'))

columns      col0      col1      col2
rows                                 
a        0.098497  0.918954  0.642800
b        0.168266  0.678434  0.455059
c        0.434939  0.244027  0.599400
d        0.877356  0.053085  0.182661

答案 1 :(得分:2)

您可以使用.to_csv()将DataFrame导出到csv文件,然后使用.read_csv()将其读回。我扩展了您已经拥有的代码,如下所示:

#!/usr/bin/env python3
# coding: utf-8

import numpy as np
import pandas as pd

I = pd.Index(["a", "b", "c", "d"], "rows")
C = pd.Index(["col0", "col1", "col2"], "cols")
df = pd.DataFrame(data=np.random.rand(4,3), index=I, columns=C)

# export DataFrame to csv
df.to_csv('out.csv')

# set index_col in order to read first column as indices
df_in = pd.read_csv('out.csv', index_col=0)

所以DataFrame df看起来像这样:

       col0      col1      col2
a  0.590016  0.834033  0.535310
b  0.421589  0.897302  0.029500
c  0.373580  0.109005  0.239181
d  0.473872  0.075918  0.751628

csv文件out.csv如下所示:

,col0,col1,col2
a,0.5900160748408918,0.8340332218911729,0.5353103406507513
b,0.42158899389955884,0.8973015040807538,0.029500416731096046
c,0.37357951184145965,0.10900495955642386,0.2391805787788026
d,0.47387186813644167,0.07591794371425187,0.7516279365972057

重新读取数据会导致DataFrame df_in,如下所示:

       col0      col1      col2
a  0.590016  0.834033  0.535310
b  0.421589  0.897302  0.029500
c  0.373580  0.109005  0.239181
d  0.473872  0.075918  0.751628

因此df2df完全相同,表明导出和所需导入按预期工作。

编辑以导出列和索引名称

df.to_csv('out.csv', index_label=[df.index.name, df.columns.name])

但是,这会使重新导入有点困难,因为列名称是作为附加列添加的。通常,这对于多索引数据很有用,但这里会产生一个额外的空列。

所以我建议只导出索引名称:

# export DataFrame to csv
df.to_csv('out.csv', index_label=df.index.name)

# set index_col in order to read first column as indices
df_in = pd.read_csv('out.csv', index_col=0)

导致df_in

          col0      col1      col2
rows                              
a     0.442467  0.959260  0.626502
b     0.639044  0.989795  0.853002
c     0.576137  0.350260  0.532920
d     0.235698  0.095978  0.194151

我不知道为什么你需要导出索引和列的名称。如果您只想访问行名或列名,可以获得如下标签:

column_labels = df.columns.get_values()
>>> array(['col0', 'col1', 'col2'], dtype=object)

index_labels = df.index.get_values()
>>> array(['a', 'b', 'c', 'd'], dtype=object)

答案 2 :(得分:1)

这里的DataFrame实际上是否具有索引名称?在我的电脑上我需要写

I = pd.Index(["a", "b", "c", "d"], name="rows")

而不是

I = pd.Index(["a", "b", "c", "d"], "rows")

表示实际分配的名称。然后使用df.to_csv()和pd.read_csv()来保留索引名称(在csv中,索引名称就像另一列一样保存)。

如果这不起作用,您是否需要能够使用Python以外的程序打开它?如果没有,你可以使用应该保持物体不受影响的泡菜:

import pickle

pickle.dump(df, open("File.pickled", "wb"))

df_read = pickle.load(open("File.pickled", "rb"))

编辑:如果您希望使用to_csv()保留列索引的名称,则可以执行以下操作:

保存它(将列索引转换为行,因此将其列索引名称设置为行索引值)

df.T.reset_index().T.to_csv("DataFrame.csv")

然后用这两个中的任何一个读取它,第一个(非常)稍快一点:

df_read = pd.read_csv("DataFrame.csv", index_col=0)
df_read.columns = df_read.loc['cols']
df_read = df_read.drop('cols', axis=0)

df_read = pd.read_csv("DataFrame.csv", index_col=0)
df_read = df_read.T.set_index('cols').T

答案 3 :(得分:0)

header=True(对于列名称)和index=True中的df.to_csv(对于索引值)应该可以解决问题。默认情况下,两者都是True,比如文档。但是,您必须在加载后手动设置索引,它将作为常规列加载。为此,我在索引中添加了一个名称:

import numpy as np
import pandas as pd

# your code:
I = pd.Index(["a", "b", "c", "d"], "rows")
C = pd.Index(["col0", "col1", "col2"], "cols")
df = pd.DataFrame(data=np.random.rand(4, 3),
                  index=I,
                  columns=C)

# name the index
I.name = 'index'

print "original:"
print df
print ""

df.to_csv("~/test.csv", index=True, header=True)

df2 = pd.read_csv("~/test.csv").set_index('index')

print "read from disk:"
print df2
print ""

输出:

original:
           col0      col1      col2
index                              
a      0.455378  0.830872  0.495953
b      0.707146  0.832009  0.112540
c      0.894997  0.156364  0.521047
d      0.775462  0.482554  0.578177

read from disk:
           col0      col1      col2
index                              
a      0.455378  0.830872  0.495953
b      0.707146  0.832009  0.112540
c      0.894997  0.156364  0.521047
d      0.775462  0.482554  0.578177