Python – Pandas DataFrame中的多级列堆叠
在Pandas数据分析库中,DataFrame是一个二维数据结构,可以看做是多个Series对象排列而成的矩阵,而Series对象则类似于Excel表中的一列。 DataFrame 可以处理多种类型的数据(数值、字符串、日期等),可以用于数据清洗、处理和分析等场景。在某些情况下,我们需要对DataFrame的列进行堆叠(stack)操作,即将多级列索引的列转化为单层列索引的列。本篇文章将详细介绍如何在Pandas DataFrame中进行多级列的堆叠操作。
堆叠的概念及用处
在Pandas DataFrame中,每一列都有一个列名,有些时候,我们可以使用多级列索引的方式,使用元组或列表来命名列名。例如以下代码:
import pandas as pd
data = {'key1': {'A': 1, 'B': 2}, 'key2': {'A': 3, 'B': 4}}
df = pd.DataFrame(data)
df.columns = [['Group1', 'Group2'], ['A', 'B']]
print(df)
输出结果如下:
Group1 Group2
A B
key1 1 2
key2 3 4
在上述代码中,我们使用了多级列索引的方式,将两个Group组织(即一级索引)下的A与B组织(即二级索引)放到了一起,用于表示DataFrame中列的排列。这种方式在那些需要处理多维度数据的场景中非常实用,可以让我们在 DataFrame 中轻松地表达多维数据,同时,在进行堆叠操作时,也能根据层级制定操作方式。
如果我们需要展示Group1的A列与Group2的B列,以及Group2的A列与Group1的B列,那么这时候就需要将多级列进行堆叠操作。
stacked_df = df.stack()
print(stacked_df)
输出结果如下:
Group1 Group2
key1 A 1.0 NaN
B NaN 2.0
key2 A 3.0 NaN
B NaN 4.0
在以上代码中,我们通过stack()方法,将多级列索引的列转化为单层列索引的列,并且将列名进行了堆叠,Group1与Group2成为了列索引中的一级索引,而A和B成为了列索引中的二级索引。
堆叠的参数设置
除了默认行为,我们还可以使用 stack() 方法来选择不同的参数,以满足不同交叉表展示需求。 stack() 方法具有可选的参数 level,它定义了在哪一个列级别上进行堆叠操作,从而使得堆叠不仅仅是在最底层索引上执行。
例如,我们可以在堆叠时选择第一级别列索引 (Group1, Group2),而不是第二级别列索引 (A, B)。
stacked_df = df.stack(level=0)
print(stacked_df)
输出结果如下:
A B
key1 Group1 1.0 NaN
Group2 NaN 2.0
key2 Group1 3.0 NaN
Group2 NaN 4.0
在这种情况下,我们可以看到Group1和Group2还是作为列名的一级索引。由于我们明确了level=0,这使得我们沿着第一级别列索引(即 Group1 和 Group2 组合)堆叠,即每列组合。
还可以指定在堆叠后列名的名称,这可以通过给 stack() 方法传递参数 name 来实现。例如,我们可以将堆叠后的列名设置为 Values:
stacked_df = df.stack().rename_axis(['key', 'Values'])
print(stacked_df)
输出结果如下:
Group1 Group2
key Values
key1 A 1.0 NaN
B NaN 2.0
key2 A 3.0 NaN
B NaN 4.0
在上面的输出中,我们可以看到列名已经由原来的一级和二级索引变成了“key”和“Values”,这样使得数据更容易阅读和理解。
堆叠操作的逆操作
在某些情况下,我们需要对经过堆叠后的DataFrame进行逆操作(即取消堆叠,还原成原有的多级列索引)。 取消堆叠操作可以使用 unstack() 方法实现。
与 stack() 方法类似,unstack() 方法的默认行为是将仅仅在最底层的列索引上进行转置。如果需要对别的层级进行逆操作,可以指定对应的列索引级别。
例如,以下代码将针对第一级别的列索引进行逆转:
unstacked_df = stacked_df.unstack(level=0)
print(unstacked_df)
输出结果如下:
Group1 Group2
key key1 key2 key1 key2
Values
A 1.0 3.0 NaN NaN
B 2.0 NaN 4.0 NaN
由于我们指定了 level=0,这使得我们沿着第一级别列索引,即 Group1 和 Group2 组合进行反转,即转换回多级列索引形式。
结论
在 Pandas DataFrame 中,将多级列进行堆叠的操作可以使得数据得到更好的展示和处理,同时用于多维数据展示的时候效果尤佳。 堆叠的逆操作可以使用 unstack() 方法实现,这样可以让数据重新还原成原有的多级列索引形式。在进行堆叠操作时,可以指定堆叠的级别和对应的列名,这样可以使得数据更易于理解和分析。