我正在尝试使用pandas取消堆叠多索引,我一直在获取:
ValueError: Index contains duplicate entries, cannot reshape
给定一个包含四列的数据集:
我首先设置了一个三级多索引:
In [37]: e.set_index(['id', 'date', 'location'], inplace=True)
In [38]: e
Out[38]:
value
id date location
id1 2014-12-12 loc1 16.86
2014-12-11 loc1 17.18
2014-12-10 loc1 17.03
2014-12-09 loc1 17.28
然后我尝试取消堆放位置:
In [39]: e.unstack('location')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-39-bc1e237a0ed7> in <module>()
----> 1 e.unstack('location')
...
C:\Anaconda\envs\sandbox\lib\site-packages\pandas\core\reshape.pyc in _make_selectors(self)
143
144 if mask.sum() < len(self.index):
--> 145 raise ValueError('Index contains duplicate entries, '
146 'cannot reshape')
147
ValueError: Index contains duplicate entries, cannot reshape
这里发生了什么?
答案 0 :(得分:34)
这是一个显示此示例的DataFrame示例,它具有相同索引的重复值。问题是,您想要聚合这些还是将它们保存为多行?
In [11]: df
Out[11]:
0 1 2 3
0 1 2 a 16.86
1 1 2 a 17.18
2 1 4 a 17.03
3 2 5 b 17.28
In [12]: df.pivot_table(values=3, index=[0, 1], columns=2, aggfunc='mean') # desired?
Out[12]:
2 a b
0 1
1 2 17.02 NaN
4 17.03 NaN
2 5 NaN 17.28
In [13]: df1 = df.set_index([0, 1, 2])
In [14]: df1
Out[14]:
3
0 1 2
1 2 a 16.86
a 17.18
4 a 17.03
2 5 b 17.28
In [15]: df1.unstack(2)
ValueError: Index contains duplicate entries, cannot reshape
一个解决方案是reset_index
(并返回df
)并使用pivot_table
。
In [16]: df1.reset_index().pivot_table(values=3, index=[0, 1], columns=2, aggfunc='mean')
Out[16]:
2 a b
0 1
1 2 17.02 NaN
4 17.03 NaN
2 5 NaN 17.28
另一种选择(如果你不想聚合)是附加一个虚拟关卡,取消它,然后放弃虚拟关卡......
答案 1 :(得分:10)
解决这个问题的解决方案要简单得多。
您获得ValueError: Index contains duplicate entries, cannot reshape
的原因是,一旦您卸下“Location
”,剩余的索引列“id
”和“date
”组合就不会更长的独特。
您可以通过保留默认索引列(行#)并使用“id
”,“date
”和“location
”设置索引来避免这种情况,将其添加到“append
”模式而不是默认的覆盖模式。
所以使用,
e.set_index(['id', 'date', 'location'], append=True)
完成此操作后,索引列仍将具有默认索引以及设置索引。 unstack
可以使用。
让我知道它是如何运作的。
答案 2 :(得分:2)
更新:纠正工作'pivot'对(id_user,信息)不能重复
有效:
df2 = pd.DataFrame({'id_user':[1,2,3,4,4,5,5],
'information':['phon','phon','phone','phone1','phone','phone1','phone'],
'value': [1, '01.01.00', '01.02.00', 2, '01.03.00', 3, '01.04.00']})
df2.pivot(index='id_user', columns='information', values='value')
它不起作用:
df2 = pd.DataFrame({'id_user':[1,2,3,4,4,5,5],
'information':['phone','phone','phone','phone','phone','phone','phone'],
'value': [1, '01.01.00', '01.02.00', 2, '01.03.00', 3, '01.04.00']})
df2.pivot(index='id_user', columns='information', values='value')