49

在该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方法调用的第一个参数。

4

6 回答 6

94

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

pandas.pivot_table(df,values='count',index='site_id',columns='week')
于 2013-10-25T22:45:37.453 回答
32

试试这个,

#drop_duplicates removes entries which have same values for 'foo' and 'bar'
df = df.drop_duplicates(['foo','bar'])
df.pivot('foo','bar','baz')
于 2012-12-12T05:14:29.717 回答
6

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

In [4]: df.pivot('name', 'id', 'x')
Out[4]: 
id    1  2
name      
john  0  0
mike  1  0
于 2012-06-28T13:46:31.953 回答
3

朋友,我也遇到过这样的问题。在我的情况下,问题出在数据中 - 我的“信息”列包含 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')
于 2016-05-04T07:29:57.077 回答
1

我的数据没有重复的数据透视对,并且数据透视表仍然抛出一个关键错误:( 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:'阅读'

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 个小时的帖子后,我一点也不聪明……有什么暗示我应该尝试让枢轴发挥作用吗?

于 2018-08-06T19:04:09.040 回答
0

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

我从这篇博文中提取了一些例子和引用,我建议你阅读下面的更多细节。

给定这样的数据:

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

我们ValueError在尝试使用g1索引和g2列进行旋转时得到一个:

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

g1请注意,第 0 行和第 1 行的和g2:具有相同的值(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:给自己另一把钥匙

这是基于这个答案

>>> 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')距离。

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

于 2021-11-10T23:05:11.117 回答