要扭转Pandas数据框架的列序,我们需要使用Pandas的pivot_table函数及DataFrame操作的reindex函数。
步骤一:创建示例DataFrame
我们先创建一个有多列、多行的示例DataFrame,以方便后续演示:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': [1, 2, 3, 4],
'name': ['Tom', 'Jerry', 'Leaf', 'Lucy'],
'age': [25, 30, 28, 22],
'gender': ['M', 'M', 'F', 'F'],
'class': ['A', 'B', 'B', 'C'],
'score1': [85, 78, 82, 90],
'score2': [90, 88, 85, 79]
})
df
该代码会输出如下的DataFrame:
id name age gender class score1 score2
0 1 Tom 25 M A 85 90
1 2 Jerry 30 M B 78 88
2 3 Leaf 28 F B 82 85
3 4 Lucy 22 F C 90 79
步骤二:使用pivot_table函数扭转列序
我们使用pivot_table函数将DataFrame从多列属性的形式转换为以某一列数据为行索引、各列属性数据作为新的列名的形式,具体就是将原有的列名变成“行索引+值”组成的两级列名。这样可以扭转DataFrame的列序,比如我们指定以id
列作为行索引,把class
列作为新的列名:
pt = pd.pivot_table(df, index=['id'], columns=['class'])
pt
注意:若某个行索引下有多个内容(如id为2和3的行中,class均为B),Pandas会将它们的值合并到同一列下,用逗号分隔。
上述代码的输出:
age gender name score1 score2
class A B C A B C A B C A B C A B C A B C
id
1 25.0 NaN NaN M.0 NaN NaN Tom NaN NaN 85.0 NaN NaN 90.0 NaN NaN 90.0 NaN NaN
2 NaN 30.0 NaN NaN M.0 NaN NaN Jerry NaN NaN 78.0 NaN NaN 88.0 NaN NaN 88.0 NaN
3 NaN 28.0 NaN NaN F.0 NaN NaN Leaf NaN NaN 82.0 NaN NaN 85.0 NaN NaN 85.0 NaN
4 NaN NaN 22.0 NaN NaN F.0 NaN NaN Lucy NaN NaN 90.0 NaN NaN 79.0 NaN NaN
步骤三:使用reindex函数重新排列列序
我们可以调用DataFrame的reindex函数,按照指定的列表来重新排列列序,以score2 -> A
、score1 -> A
、score2 -> B
、score1 -> B
、score2 -> C
的顺序重新排列:
pt = pt.reindex(columns=['score2', 'A', 'score1', 'B', 'score2', 'C', 'score1'])
pt
上述代码的输出:
score2 A score1 B score2 C score1
class A A B C A B C B C A B C A B C A B C
id
1 90.0 25.0 NaN NaN 85.0 NaN NaN NaN NaN NaN NaN NaN 90.0 NaN NaN NaN NaN NaN
2 88.0 NaN 30.0 NaN NaN 78.0 NaN NaN NaN 88.0 78.0 NaN NaN NaN NaN NaN NaN NaN
3 85.0 NaN 28.0 NaN NaN 82.0 NaN 82.0 NaN NaN 82.0 NaN NaN NaN NaN NaN NaN NaN
4 79.0 NaN NaN 22.0 NaN NaN 90.0 NaN NaN NaN NaN 90.0 NaN NaN 90.0 NaN NaN NaN
至此,我们就成功地将DataFrame的列序扭转为指定的顺序了。
完整代码如下: