转置 Pandas 数据框 Python
Transpose Pandas Dataframe Python
我有以下数据框:
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
我想转置数据框并将列 header 更改为 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
(百分比和值)+ unstack
(状态):
(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
没有那个参数。
我有以下数据框:
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
我想转置数据框并将列 header 更改为 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
(百分比和值)+ unstack
(状态):
(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
没有那个参数。