Python 熊猫:groupby取消堆栈,重复索引错误
我无法旋转/重塑数据帧。经过Python 熊猫:groupby取消堆栈,重复索引错误,python,pandas,dataframe,Python,Pandas,Dataframe,我无法旋转/重塑数据帧。经过melt()操作后,我有以下df: |----|------|------|------------| | ID | Rank | Var | Val | |----|------|------|------------| | 1 | 1 | date | 2020-01-01 | |----|------|------|------------| | 1 | 2 | date | 2020-02-01 | |----|------|-
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:索引包含重复的条目,无法重塑
好的,我们确实有重复的id
,让我们来整合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 |
|----|------|------|------------|
这更近了。现在我们只需要将秩转换为col:
df.set_index(['ID',Rank'])。groupby(['ID',Rank'])。apply(lambda x:x)。unstack(level='Rank')
ValueError:索引包含重复的条目,无法重塑
我还尝试使用了pivot\u table
,但并不是所有的列都是数字的(上面的示例已简化,但您可以在这里看到日期,这将抛出pivot\u table)
我似乎只差一个方法了,但我尝试过拆垛、重新索引、旋转、explode()
-ing,我就是搞不懂最后一部分
如何获得所需的数据帧
谢谢大家! 您的问题是索引键必须是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)
现在,让我们来解决
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
和Var
字段。
现在拆垛是微不足道的
df.set_index('Var', append=True).unstack('Rank')
你会用枢轴吗df.pivot(['ID','Var','Rank','Val')
或者ID和Var的组合会导致相同的错误吗?@It_is_Chris,谢谢你的帮助。然后发生的错误是DataError:No numeric type to aggregate
。您没有使用pivot
聚合任何数据,您的意思是pivot\u table
?@It\u is\u Chris,您是对的,我意外地认为您的意思是pivot\u table
。@Aviad_Rozenhek的答案是有效的,然而,我确实想看看一个简单的支点是否也有效。谢谢你的帮助,明白了。这起作用了。非常感谢你的帮助!