【发布时间】:2014-09-20 22:44:15
【问题描述】:
我在使用 pandas 时遇到了一个非常奇怪的问题。
我有一个熊猫时间序列,很好用。我用python标准工具腌制它,但是当我想把它解开时,pandas无法重建对象,借口索引错误。
pickling pandas 数据结构有问题吗?一种首选的方法?我打算这样做的方式有什么问题吗?
以下是详细信息:
我有一些时间序列,称为数据,经过一些处理后,想保留为泡菜文件,以加快重用速度。我的时间序列如下所示:
sample_time
2013-06-03 21:55:40 0.553846
2013-06-03 22:13:25 0.569231
...
2013-07-09 16:55:00 0.430769
2013-07-09 16:57:45 0.430769
2013-07-09 16:59:44 0.384615
Name: fill, Length: 11550
我像这样腌制 Series 对象:
pickle.dump(data,open("pickle_file","w"))
然后尝试稍后重新加载:
data_back=pickle.load(open("pickle_file",'r'))
然后我得到以下错误:
Traceback (most recent call last):
File "/home/antoine/velib/code/project_tools.py", line 197, in <module>
test()
File "/home/antoine/velib/code/project_tools.py", line 172, in test
data_back=p_l(open("test_dump",'r'))
File "/home/antoine/program/anaconda/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
File "/home/antoine/program/anaconda/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/home/antoine/program/anaconda/lib/python2.7/pickle.py", line 1217, in load_build
setstate(state)
File "/home/antoine/program/anaconda/lib/python2.7/site-packages/pandas/core/internals.py", line 2063, in __setstate__
placement=self.axes[0].get_indexer(items))
File "/home/antoine/program/anaconda/lib/python2.7/site-packages/pandas/core/index.py", line 1259, in get_indexer
raise InvalidIndexError('Reindexing only valid with uniquely'
pandas.core.index.InvalidIndexError: Reindexing only valid with uniquely valued Index objects
Pandas 拒绝重建 Series,发现索引可能不是唯一的。 但是我的时间序列日期时间索引保证是唯一的。证明:如果我从我的数据索引构建一个系列,我发现没有重复:
我制作了一个只包含我的数据系列索引的新系列。
data_index=pd.DataFrame(data=data.index)
data_index["dup"]=data_index.duplicated()
data_index
sample_time dup
0 2013-06-03 21:55:40 False
1 2013-06-03 22:13:25 False
2 2013-06-03 22:19:21 False
... ... ...
11547 2013-07-09 16:55:00 False
11548 2013-07-09 16:57:45 False
11549 2013-07-09 16:59:44 False
[11550 rows x 2 columns]
所以对我来说时间索引没有问题,它是独一无二的。 数据时间序列看起来是合法的,因为它是第一次存在的。但是在酸洗和解酸的过程中,pandas 拒绝将时间序列重新构建回来。
这可能是一个错误吗?
【问题讨论】:
-
什么版本的熊猫?
-
特别是如果你在跨版本,你应该使用内置的pickle支持:pandas.pydata.org/pandas-docs/dev/io.html#io-pickle
-
有一个错误(已在 master 中修复),请参见此处:github.com/pydata/pandas/pull/7794;但仅在它们重复时才会显示
-
pandas.__version__ 给了我 0.14.0,然后我使用相同版本的 pandas 和 pickle 在同一段代码中腌制和取消腌制两行代码
-
所以你遇到了那个错误。您可以更新到 master(0.15 也即将推出)。通常在索引中重复只会使事情更难处理。你可以这样做: s.loc[Series(s.index).duplicated()] 找到它们(只需反转索引以选择非重复项)