DataFrame持久性错误的Pandas _metadata

Sko*_*peo 5 python metadata pytables pandas

我终于弄清楚了如何从DataFrame中使用_metadata,一切正常,除了我无法持久保存它,例如hdf5或json。我知道它是可行的,因为我复制了框架,而_metadata属性则复制了“ non _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
Run Code Online (Sandbox Code Playgroud)

这个人/sf/answers/1800100361/说对他有用,但是我是这个网站(和熊猫)的新手,无法发布到该主题或直接问他。

sho*_*yer 5

_metadata开头带有下划线,这意味着它不属于公共API。它不适合用户代码使用-我们可能会在将来的任何熊猫版本中都将其破坏,而不会发出警告。

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


EdC*_*ica 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
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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

{}

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

如果您覆盖第二个属性的元数据,似乎仍然有效:

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
Run Code Online (Sandbox Code Playgroud)