Pandas unstack问题:ValueError:索引包含重复的条目,无法重构

ARF*_*ARF 51 python pandas

我试图用大熊猫取消堆叠多索引,我一直在得到:

ValueError: Index contains duplicate entries, cannot reshape
Run Code Online (Sandbox Code Playgroud)

给定一个包含四列的数据集:

  • id(字符串)
  • 日期(字符串)
  • 位置(字符串)
  • 价值(浮动)

我首先设置了一个三级多指标:

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

然后我尝试取消堆叠位置:

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

这里发生了什么?

And*_*den 37

这是一个显示此示例的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
Run Code Online (Sandbox Code Playgroud)

一种解决方案是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
Run Code Online (Sandbox Code Playgroud)

另一个选项(如果你不想聚合)是附加一个虚拟级别,将其取消堆叠,然后删除虚拟级别......

  • 我有一个大型数据框,我相当确定有正确的索引.结果表明,一些子数据帧的创建不正确,索引也是重复的.`np.where(df.index.duplicated())`在这里是一个真正的帮助. (10认同)

HVS*_*HVS 18

有一个更简单的解决方案来解决这个问题.

你得到的原因ValueError: Index contains duplicate entries, cannot reshape是,一旦你取消堆叠" Location",那么其余的索引列" id"和" date"组合就不再是唯一的.

您可以通过保留默认索引列(行#)来避免这种情况,并在使用" id"," date"和" location" 设置索引时,将其添加到" append"模式而不是默认覆盖模式.

所以使用,

e.set_index(['id', 'date', 'location'], append=True)
Run Code Online (Sandbox Code Playgroud)

完成此操作后,索引列仍将具有默认索引以及设置索引.而unstack将工作.

让我知道它是如何工作的.

  • 我打开了 13 个选项卡来搜索解决同样的问题,而 `append=True` 是唯一有效的。谢谢。 (3认同)
  • 2小时试图弄清楚这一点,简直不敢相信这可能和我见过的一些帖子一样难。 (2认同)
  • 为什么你说‘一旦你取消堆叠“Location”,那么剩下的索引列“id”和“date”组合就不再是唯一的了’?它们对我来说似乎很独特。 (2认同)

Gra*_*015 5

我有这样的问题。在我的情况下,问题出在数据中 - 我的“信息”列包含 1 个唯一值并导致错误

更新:纠正工作“枢轴”对(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')
Run Code Online (Sandbox Code Playgroud)

它不起作用

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

来源:https : //stackoverflow.com/a/37021196/6088984