Python 如何在DataFrame中存储行和列索引的名称?
我有一个带有命名行和列索引的Python 如何在DataFrame中存储行和列索引的名称?,python,pandas,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,
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
。是否有任何方法(格式和选项)存储两个索引的名称
编辑:
我知道如何与熊猫一起书写和阅读CSV。问题是保存列索引和行索引的名称。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
您可以使用将数据帧导出到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)
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
因此数据帧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
,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
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)
csv文件out.csv
如下所示:
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
,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
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)
读回中的数据将导致数据帧df\u in
,如下所示:
#!/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)
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
完全相同,这表明导出和所需的导入工作正常
编辑以导出列和索引名称:
但是,这使得重新导入有点困难,因为列名称是作为附加列添加的。通常,这对多索引数据很有用,但在这里会导致额外的空列
因此,我建议仅导出索引名称:
# 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_为:
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
我不知道为什么您需要导出索引和列的名称。如果您只想访问行或列名,可以按如下方式获取它们的标签:
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
,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
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)
这里的数据帧实际上有索引名吗?我需要在我的电脑上写字
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以外的程序打开它?如果没有,您可以使用pickle,它应该保持对象不变:
import pickle
pickle.dump(df, open("File.pickled", "wb"))
df_read = pickle.load(open("File.pickled", "rb"))
编辑:如果您希望使用to_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)
或
您可以使用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
哎呀!刚刚意识到。。。谢谢,我会纠正这个问题。然而,问题是当您同时拥有列和行的名称时。嗯,我还希望避免pickle
@MathieuDubois使用pickle将同时保存列和行名称,但是如果您想要避免,可以在保存到CSV之前将列索引设置为行。我已经用相应的代码更新了我的答案。我的代码包含一个错误(很抱歉):没有正确设置的名称。我知道如何保存在CSV中。问题是保存索引的名称。在您的代码中,
中的df_的列索引将不会设置。我也尝试过播放index_label
,但没有成功(如您所述,很难重读)。我认为CSV文件无法正确处理这一问题。我希望Excel可以工作,但据我所知,它不能。你需要这些名称做什么?我不需要这些名称,但有时它们很方便(特别是对于多索引或复杂的df)。这是我设置它们的主要原因。我已经阅读了您的答案,但它不是我想要的(我只想存储名称,而不是访问值)@Goyo answer提供了一个基于HDF格式的简单答案。我的代码包含一个错误(很抱歉):没有正确设置的名称。问题是如何保存行索引的名称和列索引的名称。代码的第一个版本是错误的(未保存的名称)。很抱歉。访问和导出索引和列的名称根本不是问题。但是,我正在考虑导入导出数据的正确方法,因为这仅在使用多索引时才有意义。但是您不需要使用多索引来正确访问数据。这似乎是一个完美的交易!