Pandas _Dataadata DataFrame持久性错误

时间:2015-01-20 09:28:35

标签: python pandas metadata pytables

我终于想出了如何从DataFrame中使用_metadata,一切正常,除了我无法坚持它,如hdf5或json。我知道它有效,因为我复制框架和_metadata属性复制“非_metadata”属性没有。

例如

df = pandas.DataFrame #make up a frame to your liking
pandas.DataFrame._metadata = ["testmeta"]
df.testmeta = "testmetaval"
df.badmeta = "badmetaval"
newframe = df.copy()
newframe.testmeta -->outputs "testmetaval"
newframe.badmeta ---> raises attribute error

#json test
df.to_json(Path)
revivedjsonframe = pandas.io.json.read_json(Path)
revivedjsonframe.testmeta ---->raises Attribute Error

#hdf5 test
revivedhdf5frame.testmeta ---> returns None

这个人https://stackoverflow.com/a/25715719/4473236说它适合他,但我是这个网站(和熊猫)的新手,不能发帖到那个帖子或直接问他。

2 个答案:

答案 0 :(得分:3)

_metadata以下划线开头,这意味着它不是公共API的一部分。它不适用于用户代码 - 我们可能会在未经警告的任何未来版本的pandas中破坏它。

我强烈建议不要使用此“功能”。目前,使用DataFrame保存元数据的最佳选择可能是编写自己的包装类并自行处理持久性。

答案 1 :(得分:1)

这是我的代码,使用python 3.3.3.2 64位

In [69]:

df = pd.DataFrame() #make up a frame to your liking
pd.DataFrame._metadata = ["testmeta"]
print(pd.DataFrame._metadata)
df.testmeta = "testmetaval"
df.badmeta = "badmetaval"
newframe = df.copy()
print(newframe.testmeta)
print("newframe", newframe.badmeta)
df.to_json(r'c:\data\test.json')
read_json = pd.read_json(r'c:\data\test.json')
read_json.testmeta
print(pd.version.version)
print(np.version.full_version)
Out[69]:

['testmeta']
testmetaval
newframe badmetaval
0.15.2
1.9.1

JSON内容为df:

In [70]:

read_json
Out[70]:
Empty DataFrame
Columns: []
Index: []
In [71]:

read_json.info()
<class 'pandas.core.frame.DataFrame'>
Float64Index: 0 entries
Empty DataFrame

In [72]:

read_json.testmeta
Out[72]:
'testmetaval'

奇怪的是,写的json只是一个空括号:

  

{}

表示元数据实际上是由语句行传播的:pd.DataFrame._metadata = ["testmeta"]

如果你覆盖第二个atrtibute的元数据,似乎仍然可以工作:

In [75]:

df.testmeta = 'foo'
df2 = pd.DataFrame()
df2.testmeta = 'bar'
read_json = pd.read_json(r'c:\data\test.json')
print(read_json.testmeta)
print(df2.testmeta)
testmetaval
bar