如何扭转Pandas数据框架的列序

  • Post category:Python

要扭转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 -> Ascore1 -> Ascore2 -> Bscore1 -> Bscore2 -> 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的列序扭转为指定的顺序了。

完整代码如下: