Pandas GroupBy Unstack
Pandas Unstack是一个函数,它可以将堆叠的数据框架中的索引列的水平进行透视。一个堆叠的数据框架通常是pandas中聚合的groupby函数的结果。Stack()将列设置到一个新的层次,而Unstack()则是对索引列的透视。有不同的方法来解开pandas数据框架,这将在下面的方法中讨论。
方法1:使用unstack()对pandas数据帧进行多级解垛的一般方法
对一个数据框架进行Groupby聚合,通常会返回一个堆叠的数据框架对象,根据聚合模型的不同,有多个层次。
# import the python pandas package
import pandas as pd
# create a sample dataframe
data = pd.DataFrame({"cars": ["bmw", "bmw", "benz", "benz"],
"sale_q1 in Cr": [20, 22, 24, 26],
'sale_q2 in Cr': [11, 13, 15, 17]},
columns=["cars", "sale_q1 in Cr",
'sale_q2 in Cr'])
print(data)
# stack the data using stack() function
stacked_data = data.stack()
print(stacked_data)
# unstack the dataframe by first level
stack_level_1 = stacked_data.unstack(level=0)
print(stack_level_1)
# unstack the dataframe by second level
stack_level_2 = stacked_data.unstack(level=1)
print(stack_level_2)
输出:
代码 解释:
- 创建一个显示两个季度汽车销售情况的样本数据框架。
- 现在,使用stack()函数将数据框架堆叠起来,这将把列与行的值堆叠起来。
- 由于我们有两列,而解开堆叠,它将被视为两个不同的层次。
- 现在,使用unstack函数,分别对第0级和第1级的数据帧进行堆叠,在两个不同的级别上进行堆叠。
- 这取决于使用情况,以堆叠第一层或第二层。
方法2:用简单的unstack()对pandas数据帧进行GroupBy解堆
每当我们在pandas数据框架上使用groupby函数时,每一列都有一个以上的聚合函数,输出通常是一个多索引的列,其中第一个索引指定了列名,第二个列索引指定了聚合函数名。
# import the python pandas package
import pandas as pd
# create a sample dataframe
data = pd.DataFrame({"cars": ["bmw", "bmw", "benz", "benz"],
"sale_q1 in Cr": [20, 22, 24, 26],
'sale_q2 in Cr': [11, 13, 15, 17]},
columns=["cars", "sale_q1 in Cr",
'sale_q2 in Cr'])
print(data)
# aggregate the car sales data by sum min
# and max sales of two quarters as shown
grouped_data = data.groupby('cars').agg(
{"sale_q1 in Cr": [sum, max],
"sale_q2 in Cr": [sum, min]})
print(grouped_data)
# general way of unstacking the grouped dataframe
gen_unstack = grouped_data.unstack()
print(gen_unstack)
# stacking the grouped dataframe at
# different levels and unstacking
# unstacking the stacked dataframe at level = 0
unstack_level1 = grouped_data.stack(level=0).unstack()
print(unstack_level1)
# unstacking the stacked dataframe at level =1
unstack_level2 = grouped_data.stack(level=1).unstack()
print(unstack_level2)
输出:
代码 解释:
- 创建一个显示两个季度汽车销售情况的样本数据框架。
- 使用GroupBy函数将汽车销售数据按两个季度的最小和最大销售量之和分组,如图所示
- 由于我们有两列,同时解开堆叠,它将被视为两个索引的两个不同层次。第一个索引将有列名,第二个索引将有聚合函数的名称。
- 现在,对分组的数据框架执行一个简单的解堆操作。这个简单的解堆将把列转换成行,反之亦然,如输出中所示
方法3:GroupBy 在两个不同层次上用多个unstack()对pandas数据帧进行解堆
一般来说,为了对GroupBy函数产生的洞察力有更深的了解,通常会在分组数据框架的不同层次上进行堆叠。这个分组数据框架可以通过使用unstack()函数在不同层次上取消堆叠来进一步调查。下面给出了实际的实现。
# import the python pandas package
import pandas as pd
# create a sample dataframe
data = pd.DataFrame({"cars": ["bmw", "bmw", "benz", "benz"],
"sale_q1 in Cr": [20, 22, 24, 26],
'sale_q2 in Cr': [11, 13, 15, 17]},
columns=["cars", "sale_q1 in Cr",
'sale_q2 in Cr'])
print(data)
# aggregate the car sales data by sum min and
# max sales of two quarters as shown
grouped_data = data.groupby('cars').agg(
{"sale_q1 in Cr": [sum, max], "sale_q2 in Cr": [sum, min]})
print(grouped_data)
# stacking the grouped dataframe at
# different levels and unstacking
# unstacking the stacked dataframe at level = 0
unstack_level1 = grouped_data.stack(level=0).unstack()
print(unstack_level1)
# unstacking the stacked dataframe at level =1
unstack_level2 = grouped_data.stack(level=1).unstack()
print(unstack_level2)
输出:
代码 解释:
- 创建一个显示两个季度汽车销售情况的样本数据框架。
- 使用GroupBy函数将汽车销售数据按两个季度的最小和最大销售量之和分组,如图所示
- 由于我们有两列,同时解开堆叠,它将被视为两个索引的两个不同层次。第一个索引将有列名,第二个索引将有聚合函数的名称。
- 现在,在分组数据框架的第0层使用stack(),并将分组数据框架unstack()。
- 然后,在分组数据框架的第1层使用stack(),并将分组数据框架unstack()。
- 这取决于在第一层或第二层取消数据帧的堆叠的用例。