我有以下数据框架:
Status Percentage Value Name Tahun
0 X 66.666667 4.0 A 2021
1 Y 33.333333 2.0 A 2021
2 Z 0.000000 0.0 A 2021
0 X 25.000000 2.0 A 2020
1 Y 62.500000 5.0 A 2020
2 Z 12.500000 1.0 A 2020
我想转换数据框并将列标题更改为Status
值。理想情况下,输出应该看起来像
X Y Z Type Name Tahun
66.666667 33.333333 0.000000 Percentage A 2021
4.0 2.0 0.0 Value A 2021
25.000000 62.500000 12.500000 Percentage A 2020
2.0 5.0 1.0 Value A 2020
我试了这个:
df = df.set_index('Status').T
,但我没有得到我所期望的输出。如何更改其余的列名?
stack
(Percentage and Value) +unstack
(Status):
(df.set_index(['Name', 'Tahun', 'Status'])
.stack()
.unstack(level='Status')
.rename_axis(('Name', 'Tahun', 'Type'))
.reset_index())
Status Name Tahun Type X Y Z
0 A 2020 Percentage 25.000000 62.500000 12.5
1 A 2020 Value 2.000000 5.000000 1.0
2 A 2021 Percentage 66.666667 33.333333 0.0
3 A 2021 Value 4.000000 2.000000 0.0
或者直接使用melt
和pivot
:
(df.melt(['Name', 'Tahun', 'Status'], var_name='Type')
.pivot('value', ['Name', 'Tahun', 'Type'], 'Status')
.reset_index()
.rename_axis(columns=None))
Name Tahun Type X Y Z
0 A 2020 Percentage 25.000000 62.500000 12.5
1 A 2020 Value 2.000000 5.000000 1.0
2 A 2021 Percentage 66.666667 33.333333 0.0
3 A 2021 Value 4.000000 2.000000 0.0
这段代码融化了数据框,使Percentage
和Value
列合并,并创建了一个新的列Type
,然后它对其进行透视,使Status
列的值成为列。
如果有重复项:
(df.melt(['Name', 'Tahun', 'Status'], var_name='Type')
.pivot_table('value', ['Name', 'Tahun', 'Type'], 'Status')
.reset_index()
.rename_axis(columns=None))
不同之处在于pivot_table
有一个aggfunc
参数,默认设置为mean
,所以如果有重复的值,它会找到其他值的平均值,而pivot
没有这个参数。