【发布时间】: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 的答案有效,但是,我确实想看看一个简单的支点是否也可以。感谢您的帮助。