python - 熊猫:groupby unstack,重复索引错误
问题描述
我无法旋转/重塑我的数据框。手术后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,我只是无法弄清楚最后一部分......
如何获得所需的数据框?
谢谢!
解决方案
您的问题是索引键必须是唯一的才能取消堆叠。
首先,让我们重新创建这个玩具示例
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)
现在,让我们解决
让我们将唯一键放入索引中,即ID
andVar
字段。现在拆垛是微不足道的
df.set_index('Var', append=True).unstack('Rank')
推荐阅读
- c# - 在 Visual Studio 中隐藏导航栏
- php - 如何使用 tc-lib-barcode 指定“X 维度”和“Y 维度”等参数
- c# - 如何在按钮上实现一个按钮,通过相同的点击删除父项和子项,而不需要父项可点击?(统一)
- nativescript - 从 NativeScript vue iOS 中的电子邮件链接打开应用程序
- formula - 有没有办法使用公式字段引用相关记录上的字段中包含的数据?
- typescript - 如何在 Typescript 中映射可能为空的数组
- java - 如何删除 GridLayout 组合中的行之间的间距?
- javascript - 球从中心而不是边缘反弹
- h2o - 得到“原因:java.lang.IllegalStateException:无法加载 HTTP 服务器:在类路径上找不到 HttpServerFacade 的实现。” 错误
- git - git checkout HEAD vs git checkout head