【问题标题】:Pandas: groupby unstack, duplicate index error熊猫:groupby unstack,重复索引错误
【发布时间】:2021-02-12 07:49:16
【问题描述】:

我在旋转/重塑我的数据框时遇到问题。在melt() 操作之后,我有以下df:

|----|------|------|------------|
| ID | Rank | Var  | Val        |
|----|------|------|------------|
|  1 |   1  | date | 2020-01-01 |
|----|------|------|------------|
|  1 |   2  | date | 2020-02-01 |
|----|------|------|------------|
|  2 |   1  | date | 2020-01-01 |
|----|------|------|------------|
|  2 |   2  | date | 2020-02-01 |
|----|------|------|------------|
|  1 |   1  | amt  | 320        |
|----|------|------|------------|
|  1 |   2  | amt  | 480        |
|----|------|------|------------|
|  2 |   1  | amt  | 620        |
|----|------|------|------------|
|  2 |   2  | amt  | 400        |
|----|------|------|------------|

我正在寻找的结果是将排名值转换为列:

|----|------|------------|------------|
| ID | Var  | 1          | 2          |
|----|------|------------|------------|
| 1  | date | 2020-01-01 | 2020-02-01 |
|    |------|------------|------------|
|    | amt  | 320        | 480        |
|----|------|------------|------------|
| 2  | date | 2020-01-01 | 2020-02-01 |
|    |------|------------|------------|
|    | amt  | 620        | 400        |
|----|------|------------|------------|

立即尝试unstack(level='Rank') 会导致

ValueError:索引包含重复条目,无法重塑

好的,我们确实有重复的IDs,让我们groupby 合并:

df.set_index(['ID', 'Rank']).groupby(['ID', 'Rank']).apply(lambda x: x)

apply() 只是为了我们可以返回一个数据框并预览结果,它们是:

|----|------|------|------------|
| ID | Rank | Var  | Val        |
|----|------|------|------------|
|  1 |   1  | date | 2020-01-01 |
|    |------|------|------------|
|    |   1  | amt  | 320        |
|    |------|------|------------|
|    |   2  | date | 2020-02-01 |
|    |------|------|------------|
|    |   2  | amt  | 480        |
|----|------|------|------------|
|  2 |   1  | date | 2020-01-01 |
|    |------|------|------------|
|    |   2  | date | 2020-02-01 |
|    |------|------|------------|
|    |   1  | amt  | 620        |
|    |------|------|------------|
|    |   2  | amt  | 400        |
|----|------|------|------------|

这更近了。现在我们只需要将 Rank 转换为 cols:

df.set_index(['ID', 'Rank']).groupby(['ID', 'Rank']).apply(lambda x: x).unstack(level='Rank')

ValueError:索引包含重复条目,无法重塑

??????

我也尝试使用pivot_table,但并非所有列都是数字的(上面的示例已简化,但您可以在此处查看日期,这会导致 pivot_table 失效)。

我似乎只剩下一种方法了,但我已经尝试过取消堆叠、重新索引、旋转,explode()-ing,我就是想不通这最后一部分......

我怎样才能得到想要的数据框?

谢谢!

【问题讨论】:

  • 你可以使用pivot吗? df.pivot(['ID', 'Var'], 'Rank', 'Val')或者是ID和Var的组合会导致同样的错误吗?
  • @It_is_Chris,感谢您的帮助。然后发生的错误是DataError: No numeric types to aggregate
  • 您没有使用pivot 聚合任何数据,您的意思是pivot_table
  • @It_is_Chris,你是对的,我不小心以为你的意思是pivot_table。 @ Aviad_Rozenhek 的答案有效,但是,我确实想看看一个简单的支点是否也可以。感谢您的帮助。

标签: python pandas dataframe


【解决方案1】:

您的问题是索引键必须是唯一的 unstack。

首先,让我们重新创建这个玩具示例

import pandas as pd
from IPython.display import display

df= pd.DataFrame(columns=['ID', 'Rank','Var', 'Val'],  data=[
    [1,1,'date', '2020-01-01'],
    [1,2,'date','2020-02-01'],
    [2,1,'date','2020-02-01'],
    [2,2,'date','2020-02-01'],
    [1,1,'amt',320],
    [1,2,'amt',480],
    [2,1,'amt',620],
    [2,2,'amt',400],
])

df = df.set_index(['ID', 'Rank'])
display(df)

现在,让我们解决

让我们将唯一键放入索引中,即IDVar 字段。 现在拆垛很简单

df.set_index('Var', append=True).unstack('Rank')

【讨论】:

  • 你明白了。这行得通。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2019-04-07
  • 2015-11-22
  • 2020-06-30
  • 1970-01-01
  • 2019-08-26
  • 2016-09-23
  • 2020-10-12
  • 2013-06-03
相关资源
最近更新 更多