我终于想出了如何从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说它适合他,但我是这个网站(和熊猫)的新手,不能发帖到那个帖子或直接问他。
答案 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