【问题标题】:Pandas pivot warning about repeated entries on index关于索引重复条目的 Pandas 枢轴警告
【发布时间】:2021-11-11 07:05:11
【问题描述】:

pivot 方法的 Pandas 文档中,我们有:

Examples
--------
>>> df
    foo   bar  baz
0   one   A    1.
1   one   B    2.
2   one   C    3.
3   two   A    4.
4   two   B    5.
5   two   C    6.

>>> df.pivot('foo', 'bar', 'baz')
     A   B   C
one  1   2   3
two  4   5   6

我的DataFrame 结构如下:

   name   id     x
----------------------
0  john   1      0
1  john   2      0
2  mike   1      1
3  mike   2      0

我想要这样的东西:

      1    2   # (this is the id as columns)
----------------------
mike  0    0   # (and this is the 'x' as values)
john  1    0

但是当我运行pivot 方法时,它会说:

*** ReshapeError: Index contains duplicate entries, cannot reshape

这没有意义,即使在示例中,foo 列上也有重复条目。我使用name 列作为枢轴的索引,即pivot 方法调用的第一个参数。

【问题讨论】:

  • 我列举了几个例子here

标签: python pandas


【解决方案1】:

据我所知,对于 pandas 的更新,您必须使用 pivot_table() 而不是 pivot()。

pandas.pivot_table(df,values='count',index='site_id',columns='week')

【讨论】:

  • 我遇到了同样的问题,您的回答为我解决了(与其他问题相比)。我正在使用熊猫 0.12.0。
  • DataFrame.duplicated() 似乎返回非重复行;它忽略了我的日期列(即,当您在不同日期重复测量时,duplicated() 声称它们是重复的,即使它们具有不同的日期。)
  • 有什么区别?
  • 这个答案是错误的。 pivot_table 创建一个多索引对象,而不是一个普通的表。
  • 我在这个Q&A中提供了几个详细的例子和替代方案
【解决方案2】:

试试这个,

#drop_duplicates removes entries which have same values for 'foo' and 'bar'
df = df.drop_duplicates(['foo','bar'])
df.pivot('foo','bar','baz')

【讨论】:

  • 伟大的收获!我实际上只需要删除我的重复项。谢谢!
  • 我认为这可能是大多数访问这里的人的正确答案。人们很困惑,因为他们认为 pandas 需要一个唯一的索引。实际上,pandas 要求索引和列一起唯一,即原始帧中没有索引和列列重复的行。
  • 这个答案(以及 foobarbeque 的阐述)对我理解 pandas 错误非常有帮助。只是想补充一点,就我而言(根据我的经验,大多数情况下),执行drop_duplicates 会消除错误并隐藏问题,但实际上并不能解决问题。通常,当您假设您的索引/列是您正在旋转的某种类型的记录的唯一标识符时,您会执行这样的操作,因此如果您在此处获取删除重复项,则上游某处可能存在错误。同样,至少在我的经验中
  • @foobarbecue,非常好的评论!现在我想知道为什么错误消息只关注index 而不是index,column 这对...不过,谢谢!
【解决方案3】:

适合我吗?你能发布你正在使用的确切的数据透视方法调用吗?

In [4]: df.pivot('name', 'id', 'x')
Out[4]: 
id    1  2
name      
john  0  0
mike  1  0

【讨论】:

  • 我有很多数据,这是一个小功能示例,我会尝试使用原始数据,但错误信息本身就是无意义的,因为索引可以有重复的条目,你什么认为?
  • 如果你有重复,你可能需要先聚合。最好添加一个选项来进行透视以获取第一个或最后一个观察到的条目:github.com/pydata/pandas/issues/1865
  • python3不应该有这个问题
  • python 3 还是有这个问题。
【解决方案4】:

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

UPD:更正工作“枢轴”对(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')

【讨论】:

    【解决方案5】:

    我的数据没有重复的数据透视对,但 pivot_table 仍然会抛出一个关键错误:( drop_duplicates() 将我的数据截断为数据对的第一个值。

    输入:

    Well    Reading     Filter 4
    0   A2  1   116041
    1   B2  1   105191
    2   C2  1   93942
    3   D2  1   96821
    4   E2  1   85622
    5   F2  1   90227
    6   G2  1   95801
    7   H2  1   107833
    8   A2  2   115765
    9   B2  2   104395
    10  C2  2   93986
    ...
    1630    G2  204     388682
    1631    H2  204     444708
    
    1632 rows × 3 columns
    

    df_X2.pivot_table('Reading', 'Well', 'Filter 4')

    抛出:KeyError: 'Reading'

    df_X2_uniq=df_X2.drop_duplicates(['Well', 'Reading']) 将数据截断到前 8 行:

        Well    Reading     Filter 4
    0   A2  1   116041
    1   B2  1   105191
    2   C2  1   93942
    3   D2  1   96821
    4   E2  1   85622
    5   F2  1   90227
    6   G2  1   95801
    7   H2  1   107833
    

    在梳理了 2 个小时的帖子后,我一点也不聪明……有什么提示我应该尝试让支点发挥作用吗?

    【讨论】:

    • pivot_table 的第一个参数是数据框
    【解决方案6】:

    正如几个答案所指出的,问题不在于您的索引中有重复的值(错误消息在这里肯定没有帮助),而是您有重复的 (index, column)。一些答案建议您只删除这些重复项,但我会小心这样做 - 根据我的经验,这很少是正确的选择。通常,您可能希望以某种方式聚合您的数据,然后然后进行数据透视。

    我从this blog post 中提取了一些示例和引用,我建议您阅读下面的详细信息。

    给定这样的数据:

    df = pd.DataFrame([
        ['a', 'x', 1],
        ['a', 'x', 2],
        ['b', 'x', 3],
        ['b', 'y', 4]
    ], columns=['g1', 'g2', 'value'])
    

    这样打印:

    >>> print(df)
      g1 g2  value
    0  a  x      1
    1  a  x      2
    2  b  x      3
    3  b  y      4
    

    当尝试以g1 作为索引并以g2 作为列进行旋转时,我们得到一个ValueError

    >>> df.pivot(index='g1', columns='g2', values='value')
    ...
    ValueError: Index contains duplicate entries, cannot reshape
    

    请注意,第 0 行和第 1 行具有相同的 g1g2 值:(a, x)。因此,当 pandas 创建您的旋转数据框时,对于 a 索引、g1 列,如何只选择一个值:1 或 2?答案是……我们不能!这就是删除重复项有效的原因,但它可能不是您想要的,因为您正在丢失可能有用的数据。那么我们能做些什么呢?

    解决方案 1:聚合

    对于您的用例并不总是有一个聚合函数,但如果有的话,有几种方法可以实现这一点。

    df.pivot_table(index='g1', columns='g2', values='value', aggfunc='sum')
    
    df_agg = df.groupby(by=['g1', 'g2']).value.sum().reset_index()
    df_agg.pivot(index='g1', columns='g2', values='value')
    
    df.groupby(by=['g1', 'g2']).value.sum().unstack()
    

    所有这些都会产生相同的结果:

    g2    x    y
    g1          
    a   3.0  NaN
    b   3.0  4.0
    

    但是如果您不需要总和怎么办?也许逗号分隔值对您有用?

    df.pivot_table(
        index='g1',
        columns='g2',
        values='value',
        aggfunc=lambda x: ','.join(x.astype('str'))
    )
    # we need to convert to strings before we can join
    

    得到:

    g2    x    y
    g1          
    a   1,2  NaN
    b     3    4
    

    或者您可以使用list 作为您的aggfunc

    pv = df.pivot_table(index='g1', columns='g2', values='value', aggfunc=list)
    

    然后我们就可以爆炸了!

    >>> pv.explode('x').explode('y')
    g2  x    y
    g1        
    a   1  NaN
    a   2  NaN
    b   3    4
    

    解决方案 2:给自己另一把钥匙

    这是基于this answer

    >>> df['key'] = df.groupby(['g1', 'g2']).cumcount()
    >>> df
      g1 g2  value  key
    0  a  x      1    0
    1  a  x      2    1
    2  b  x      3    0
    3  b  y      4    0
    

    现在我们可以使用复合索引进行旋转:

    >>> df.pivot(index=['key', 'g1'], columns='g2', values='value').reset_index().drop(columns='key')
    g2 g1    x    y
    0   a  1.0  NaN
    1   b  3.0  4.0
    2   a  2.0  NaN
    

    这与上面分解的示例几乎相同,只是一个set_index('g1')

    希望这会有所帮助!我经常遇到这个问题,通常会忘记这一切..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-30
      • 2016-11-07
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      相关资源
      最近更新 更多