我有一张桌子,我正在尝试以特定方式重塑。
import pandas as pd
df = pd.DataFrame({'race': ['one', 'one', 'one', 'two', 'two', 'two'],
'type': ['D', 'K', 'G', 'D', 'D', 'K'],
'item': ['x', 'y', 'z', 'q', 'x', 'y'],
'level': [1, 2, 1, 6, 2, 3]})
df
生成的数据框:
race type item level
0 one D x 1
1 one K y 2
2 one G z 1
3 two D q 6
4 two D x 2
5 two K y 3
我想将其重塑为这种格式:
D K G
item level item level item level
race
one x 1 y 2 z 1
two q 6 y 3 NaN NaN
two x 2 NaN NaN NaN NaN
item
在race
中是独一无二的,但它可以出现在多个不同的种族中。race
列或索引必须扩展以适应比赛中的项目数量。在上面的示例中,竞赛“two”中有两个“D”项目,因此竞赛“two”在 2 行中重复两次以容纳这两个项目。如果有
比赛“二”中有 5 个“K”项目,比赛“二”需要重复 5 个
次。怎样才能达到我想要的桌子形状?
我已经尝试过:
df.pivot(index='race', columns='type', values=['level', 'item'])
这给出了错误:
ValueError: Index contains duplicate entries, cannot reshape
还有其他方法可以使用
pd.pivot
、pd.groupby
、pd.pivot_table
或 pd.crosstab
或其他可以工作的 pandas 或 dataframe 方法吗?
您必须首先按种族/类型进行重复数据删除:
(df.assign(n=df.groupby(['race', 'type']).cumcount())
.pivot(index=('race', 'n'), columns='type', values=['level', 'item'])
.sort_index(level='type', axis=1)
)