Pandas 数据重塑

1. 前言

上一节我们学习了 Pandas 层次化索引的概念,可以用来表示更高维度的数据集。我们前面学习的数据处理大多是在数据值层面进行操作,有时候的数据分析仅仅靠数据值的处理是完全不够的,还要对数据的结构做处理,使其更加适合分析的需要,那 Pandas 库又提供了怎样的操作来实现这类需要呢?

Pandas 提供了数据重塑 / 轴向旋转的操作来对数据进行重新排列,实现数据的结构变化,本节课我们将一起学习该操作的具体实现方式,主要涉及到 stack () ,unstack () 和 pivot () 三个操作函数。

2. 数据重塑

Pandas 对应数据的重塑有三种操作方式,分别为重塑操作 stack () , unstack () 和轴向旋转操作 pivot ():

  • stack ():该操作是将数据的列 “旋转” 为行;
  • unstack ():该操作是将数据的行 “旋转” 为列。

下面我们先构造一些模拟数据,然后详细讲解这两种数据重塑的方式:

# 导入 Pandas 库
import pandas as pd
# 构造数据集
df_data=pd.DataFrame([[96,92,83,94],[85,86,77,88],[69,90,91,82]],
                 index=['语文','数学','英语'],
                 columns=['月考1','月考2','月考3','月考4'])
print(df_data)
# --- 输出结果 ---
    月考1  月考2  月考3  月考4
语文   96   92   83   94
数学   85   86   77   88
英语   69   90   91   82
# 结果解析:这就是我们前面几节课学习的,创建一个 DataFrame 数据集的方式。

# 接下来我们为 df_data 数据集指定行索引和列索引的索引名,分别为 “科目”,“模考”,这里要注意索引名和索引值的区别,我们上面的 index 和 columns 参数指定的是行索引和列索引值。
df_data.index.name='科目'
df_data.columns.name='模考'
print(df_data)
# --- 输出结果 ---
模考  月考1  月考2  月考3  月考4
科目                    
语文   96   92   83   94
数学   85   86   77   88
英语   69   90   91   82
# 结果解析:这里可以看到 df_data 数据集中有了行索引名“科目”和列索引名“模考”。

1. stack() 函数

通过该函数,我们将 df_data 数据集的数据列转为数据行:

# df_data 为上述构建的数据集
print(df_data.stack())
# --- 输出结果 ---
科目  模考 
语文  月考1    96
     月考2    92
     月考3    83
     月考4    94
数学  月考1    85
     月考2    86
     月考3    77
     月考4    88
英语  月考1    69
     月考2    90
     月考3    91
     月考4    82

结果解析:通过列旋转为行的重塑方式,我们看月考列数据变为了行数据,得到数据集有了层次化的列索引,一维的 “科目”,二维的 “模考”,这样的数据结构对于我们分析每科在各次月考中成绩的变化有很好的帮助。

2. unstack() 函数

通过该函数,我们将 df_data 数据集的数据行转为数据列:

# df_data 为上述构建的数据集
print(df_data.unstack())
# --- 输出结果 ---
模考   科目
月考1  语文    96
      数学    85
      英语    69
月考2  语文    92
      数学    86
      英语    90
月考3  语文    83
      数学    77
      英语    91
月考4  语文    94
      数学    88
      英语    82

结果解析:这里可以看到,原数据中的科目行数据,变为了列数据,索引也是层次化的索引,对于我们分析每次月考各科目成绩的波动有很好的帮助。

如果我们对 stack () 操作后返回的数据集,再进行 unstack () 操作,会发现回到了原数据结构,说明 unstack () 是 stack () 的逆操作:

print(df_data.stack().unstack())
# --- 输出结果 ---
模考  月考1  月考2  月考3  月考4
科目                    
语文   96   92   83   94
数学   85   86   77   88
英语   69   90   91   82

3. pivot() 函数

该函数用于指定行索引,列索引,以及数据值,生成一个 “pivot” 数据表格。该函数有三个参数:

参数名 说明
index 新数据集的列索引
columns 新数据集的行索引
values 对应行和列所要填充的数据值,如果没有,填充 NaN

下面我们先模拟一个 DataFrame 数据集,便于该函数的操作效果展示:

# 这里模拟了3年某位学生各学期语文、数学得分的数据表。
df_data_pivot=pd.DataFrame([["2018","上学期",83,94],["2018","下学期",77,88],
                            ["2019","上学期",83,94],["2019","下学期",83,94],
                            ["2020","上学期",83,94],["2020","下学期",91,82]],
                 index=['a','b','c','d','e','f'],
                 columns=['年度','学期','语文','数学'])
print(df_data_pivot)

# --- 输出结果 ---
     年度   学期  语文  数学
a  2018  上学期  83  94
b  2018  下学期  77  88
c  2019  上学期  83  94
d  2019  下学期  83  94
e  2020  上学期  83  94
f  2020  下学期  91  82

接下来我们将通过函数 pivot () 指定行索引、列索引以及数据值,生成新的数据集:

# pivot(index="年度", columns="学期", values="语文")
new_df=df_data_pivot.pivot(index="年度", columns="学期", values="语文")
print(new_df)
# --- 输出结果 ---
学期    上学期  下学期
年度            
2018   83   77
2019   83   83
2020   83   91

输出解析:我们这里指定行索引为年度,列索引为学期,填充对应行和列索引的语文数据值,通过输出结果可以看到新的数据集,这样处理之后的数据结构是很利于我们分析各年度各学期语文成绩的一个变化情况。

3. 小结

本节课程我们主要学习了 Pandas 库对于数据的重塑操作,该操作能有效的满足我们对原数据的数据结构的变换操作,进而满足我们对数据不同的分析需要。本节课程的重点如下:

  • stack () 函数和 unstack () 函数的具体操作方法,以及他们之间的区别;
  • pivot () 函数的使用条件和操作方法。