Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在DataFrame中存储行和列索引的名称?_Python_Pandas - Fatal编程技术网

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格式的简单答案。我的代码包含一个错误(很抱歉):没有正确设置的名称。问题是如何保存行索引的名称和列索引的名称。代码的第一个版本是错误的(未保存的名称)。很抱歉。访问和导出索引和列的名称根本不是问题。但是,我正在考虑导入导出数据的正确方法,因为这仅在使用多索引时才有意义。但是您不需要使用多索引来正确访问数据。这似乎是一个完美的交易!