我有一个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。问题是保存列索引和行索引的名称。
答案 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
因此df2
与df
完全相同,表明导出和所需导入按预期工作。
编辑以导出列和索引名称:
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