【Python从入门到进阶】67、Pandas使用stack和pivot实现数据透视

接上篇《66、Pandas怎样实现groupby每个分组的apply

上一篇我们学习了Pandas怎样实现groupby每个分组的apply,本篇我们来学习Pandas使用stack和pivot实现数据透视

一、Pandas数据透视基础

1、Pandas数据透视的基本概念

Pandas数据透视(pivot)是Pandas库中一种强大的数据重塑功能,它允许用户按照指定的维度对数据进行重新排列和汇总。在数据分析和数据科学领域,数据透视是进行数据探索、数据清洗和数据分析的重要工具。通过数据透视,用户可以从不同的角度观察数据,从而发现数据中的隐藏规律和模式。

Pandas数据透视的基本操作涉及将原始数据表中的数据按照指定的行索引(index)、列索引(columns)和值(values)进行分组汇总。其中,行索引和列索引定义了数据透视表的二维结构,而值则指定了每个单元格中应该显示的数据类型(如计数、求和、平均值等)。

假设我们有一个电影评分数据集,其中包含电影名称、导演、演员、评分和评分人数等字段。现在,我们想要通过数据透视表来统计每个导演拍摄的电影在不同评分区间内的评分人数分布情况。

首先,我们需要将原始数据表中的数据按照导演(作为行索引)、评分区间(作为列索引)和评分人数(作为值)进行分组汇总。这可以通过Pandas的pivot方法来实现,最终效果如下:

2、数据透视的作用和意义

数据透视在数据分析中具有至关重要的作用和意义。首先,它能够帮助用户快速地从大量数据中提取有用的信息,而无需编写复杂的代码或查询语句。通过简单地指定行索引、列索引和值,用户就可以轻松地生成所需的数据透视表。

其次,数据透视提供了灵活的数据重组方式,使用户可以按照不同的维度对数据进行观察和分析。例如,在销售数据分析中,用户可以通过数据透视表来观察不同时间段、不同产品类别或不同销售渠道的销售情况。这种灵活性使得数据透视成为数据分析和数据可视化中不可或缺的工具。

此外,数据透视还提供了强大的数据汇总功能。用户可以通过对数据透视表中的单元格进行计数、求和、平均值等计算,来得到更加直观和有用的数据结果。这些结果可以帮助用户更好地理解数据的分布和特征,从而做出更加明智的决策。

二、使用stack实现数据透视

1、stack方法的语法和功能

Stack方法是一种将数据的列标签(column labels)转换为行索引(row index)的操作,从而创建一个更高维度的数据结构。这种操作可以方便地处理多层次的数据,使数据更易于处理和分析。Stack操作可以分为单级堆叠和多级堆叠,根据具体需求选择不同的堆叠方式。

在Pandas中,stack()函数通常用于将多级索引(MultiIndex)中的"列索引"移动到"行索引"中,从而"压缩"数据结构。其语法结构为DataFrame.stack(level=-1, dropna=True),其中level参数表示要堆叠的级别,-1表示最内层,也可以通过0, 1, 2等指定多层索引的对应层;dropna参数用于控制是否删除结果中的NA/null值。

2、示例演示

在数据分析和处理中,使用栈(stack)结构可以帮助我们处理具有层次结构的数据,特别是在需要将数据从宽格式(wide format)转换为长格式(long format)时。虽然Pandas本身并不直接提供一个栈数据结构(它有自己的DataFrame和Series结构),但我们可以利用Pandas的stack()和unstack()方法来处理数据的透视(pivot)操作。下面是一个使用Pandas的stack()方法将宽格式数据转换为长格式数据的示例,这通常是在准备数据以进行进一步分析或可视化时的常见任务:

python 复制代码
import pandas as pd

# 创建一个示例DataFrame,包含销售数据
data = {
    'Product': ['Apple', 'Banana', 'Cherry'],
    '2021_Q1': [100, 150, 200],
    '2021_Q2': [110, 160, 210],
    '2021_Q3': [120, 170, 220],
    '2021_Q4': [130, 180, 230]
}
df = pd.DataFrame(data)

print("原始宽格式数据:")
print(df)

# 设置'Product'列为索引
df.set_index('Product', inplace=True)

# 这里的列名(如'2021_Q1', '2021_Q2'等)将构成堆叠后的MultiIndex的一部分
# 我们不需要显式地创建MultiIndex,因为stack()方法会自动处理

# 使用stack()方法将宽格式数据转换为长格式
df_stacked = df.stack().reset_index()

# 重命名列以更符合常规的长格式数据表示
df_stacked.columns = ['Product', 'Quarter', 'Sales']

# 打印转换后的长格式数据
print("转换后的长格式数据:")
print(df_stacked)

效果:

在这个例子中,我们有一个包含不同产品('Apple', 'Banana', 'Cherry')和四个季度('2021_Q1', '2021_Q2', '2021_Q3', '2021_Q4')销售数据的DataFrame。通过使用stack()方法,我们将宽格式数据转换为长格式,其中每一行代表一个特定的产品销售记录,包括产品名称、季度和销售量。这种长格式数据非常适合于进一步的数据分析、可视化或机器学习处理。

3、stack方法中的参数设置及其影响

在stack()方法中,level参数用于指定要堆叠的级别。如果DataFrame有多个级别的索引,你可以通过指定level参数来选择要堆叠的级别。例如,如果DataFrame有两个级别的索引(行索引和列索引),你可以通过stack(level=0)来将行索引堆叠到列索引中,或者通过stack(level=1)来将列索引堆叠到行索引中。如果level参数未指定,则默认堆叠最内层的索引。

dropna参数用于控制是否删除结果中的NA/null值。如果设置为True,则删除结果中的NA/null值;如果设置为False,则保留NA/null值。

4、stack方法在数据透视中的优势和局限性

(1)优势:

·灵活性:Stack方法允许用户根据需要选择堆叠的级别,从而创建出灵活的数据结构。

·易于分析:通过将列索引转换为行索引,Stack方法可以帮助用户更直观地分析数据,特别是当数据具有多层次索引时。

·高效性:在处理大规模数据时,Stack方法通常能够提供高效的性能。
(2)局限性:

·数据结构限制:Stack方法只能用于具有多级索引的DataFrame,对于单层索引的DataFrame,无法使用Stack方法进行数据透视。

·数据冗余:在某些情况下,使用Stack方法可能会导致数据冗余,因为需要将列索引转换为行索引。这可能会增加数据的存储和处理成本。

·理解难度:对于不熟悉Pandas库的用户来说,理解Stack方法的语法和功能可能需要一定的时间和努力。

三、使用pivot实现数据透视

1、pivot方法的语法和功能

pivot方法是Pandas库中一个非常强大的工具,它允许用户根据指定的索引、列和值来重塑DataFrame。这种方法特别适用于需要将数据从一种格式转换到另一种格式(如从宽格式到长格式,或从长格式到宽格式)的场景,尤其是在进行数据透视表操作时。

pivot方法的语法如下:

python 复制代码
DataFrame.pivot(index=None, columns=None, values=None)

●index:用于指定新DataFrame的行索引。这通常是原始DataFrame中的一个或多个列。

●columns:用于指定新DataFrame的列索引。这也通常是原始DataFrame中的一个或多个列。

●values:用于指定要填充到新DataFrame中的数据值。这通常是原始DataFrame中的一个列,其值将根据index和columns的设置被放置在正确的位置。

pivot方法的功能是创建一个新的DataFrame,其行和列由index和columns参数指定,而数据值则由values参数提供。如果指定的index、columns组合在原始DataFrame中不存在,pivot方法将抛出错误。

2、示例演示

假设我们有一个包含销售数据的DataFrame,其中包含销售人员、产品和销售额的信息。我们可以使用pivot方法将这个DataFrame转换为一个数据透视表,其中销售人员作为行,产品作为列,销售额作为数据值。

python 复制代码
import pandas as pd

# 创建示例DataFrame
data = {
    '销售人员': ['张三', '李四', '张三', '王五', '李四', '王五'],
    '产品': ['苹果', '苹果', '香蕉', '香蕉', '草莓', '草莓'],
    '销售额': [100, 150, 200, 250, 300, 350]
}
df = pd.DataFrame(data)

print("原始宽格式数据:")
print(df)

# 使用pivot方法创建数据透视表
pivot_table = df.pivot(index='销售人员', columns='产品', values='销售额')

print("转换后的长格式数据:")
print(pivot_table)

效果:

在这个例子中,pivot方法成功地根据销售人员和产品创建了一个数据透视表,其中销售额被正确地放置在了对应的单元格中。

3、pivot方法中的参数设置及其影响

index参数决定了新DataFrame的行索引。在这个例子中,我们使用了'Salesperson'列作为行索引。

columns参数决定了新DataFrame的列索引。在这个例子中,我们使用了'Product'列作为列索引。

values参数决定了要填充到新DataFrame中的数据值。在这个例子中,我们使用了'Sales'列作为数据值。

如果index和columns的组合在原始DataFrame中不存在,pivot方法将抛出一个KeyError。此外,如果values列中包含非数值数据(如字符串或日期),则可能需要在进行透视之前对这些数据进行适当的转换或处理。

4、pivot方法在数据透视中的优势和局限性

pivot方法的优势在于它能够以非常直观和简洁的方式创建数据透视表。与手动使用set_index和unstack方法相比,pivot方法提供了更简洁的语法和更易于理解的参数设置。

然而,pivot方法也有一些局限性。首先,它要求index和columns的组合在原始DataFrame中是唯一的。如果存在重复的组合,pivot方法将抛出错误。其次,pivot方法在处理大型数据集时可能会比较慢,因为它需要创建一个新的DataFrame并填充数据值。

在原理上,pivot方法相当于首先对DataFrame使用set_index方法创建一个分层索引(由index和columns参数指定的列组成),然后调用unstack方法将分层索引的某一级转换为列索引。然而,与手动执行这些步骤相比,pivot方法提供了更简洁和更易于理解的接口。

四、使用unstack实现数据二维透视

1、详细介绍unstack方法的语法和功能

unstack方法是Pandas库中用于将多级索引(MultiIndex)的某一级转换为列索引,从而实现数据从长格式到宽格式的转换。它常用于数据透视表的生成,特别是当数据已经通过stack方法或其他方式被重塑为长格式后,unstack可以帮助我们将其转换回宽格式。

unstack方法的语法如下:

python 复制代码
DataFrame.unstack(level=-1, fill_value=None)

●level:指定要转换为列索引的多级索引的级别。默认值为-1,表示最内层的索引级别。如果DataFrame有多个级别的索引,可以通过指定level参数来选择要转换的级别。

●fill_value:用于填充因转换而产生的缺失值。默认值为None,表示不填充缺失值。

●unstack方法的功能是将DataFrame中指定的索引级别转换为列索引,同时保持其他级别的索引作为行索引。如果指定的级别在索引中不存在,unstack方法将抛出错误。

2、示例演示

这里我们将stack章节处理后的长格式表格,通过unstack方法转换回短格式:

python 复制代码
import pandas as pd

# 创建一个示例DataFrame,包含销售数据
data = {
    'Product': ['Apple', 'Banana', 'Cherry'],
    '2021_Q1': [100, 150, 200],
    '2021_Q2': [110, 160, 210],
    '2021_Q3': [120, 170, 220],
    '2021_Q4': [130, 180, 230]
}
df = pd.DataFrame(data)

# 设置'Product'列为索引
df.set_index('Product', inplace=True)

# 使用stack()方法将宽格式数据转换为长格式
df_stacked = df.stack().reset_index()

# 重命名列以更符合常规的长格式数据表示
df_stacked.columns = ['Product', 'Quarter', 'Sales']

# 打印转换后的长格式数据
print("长格式数据:")
print(df_stacked)

# 使用unstack()方法将长格式数据转换回宽格式
# 这里我们将'Quarter'列重新变为列索引,'Product'列保持为行索引
df_unstacked = df_stacked.set_index(['Product', 'Quarter'])['Sales'].unstack()

# 打印转换后的宽格式数据
print("\n转换回宽格式数据:")
print(df_unstacked)

效果:

这样,我们就成功地将长格式数据转换回了宽格式数据。unstack()方法的作用是将指定的索引级别(在这个例子中是Quarter)转换为列索引,从而恢复原始数据表的宽格式结构。

3、unstack方法中的参数设置及其影响

●level参数决定了要转换为列索引的索引级别。如果DataFrame有多个级别的索引,可以通过指定level参数来选择要转换的级别。如果设置为-1(默认值),则表示转换最内层的索引级别。

●fill_value参数用于填充因转换而产生的缺失值。如果某些组合在原始数据中不存在,则转换后的DataFrame中相应的单元格将为NaN。通过指定fill_value参数,可以用一个特定的值来填充这些缺失值。

4、unstack方法在数据透视中的作用

unstack方法在数据透视中起着至关重要的作用,它允许我们将长格式的数据转换为宽格式,从而更直观地展示数据的不同维度。在数据分析和可视化的过程中,这种转换通常是必要的,因为宽格式的数据更容易被理解和解释。

unstack方法与stack方法互为逆操作。stack方法用于将宽格式的数据转换为长格式,通过创建一个新的索引级别来将列转换为行。而unstack方法则相反,它将长格式数据中的某一索引级别转换为列,从而恢复宽格式的结构。这种互逆关系使得stack和unstack方法成为数据重塑和透视表生成中不可或缺的工具。

至此,有关Pandas使用stack和pivot实现数据透视的所有内容介绍完毕,有关Python实战的所有内容也结束了,感谢各位小伙伴一直以来的支持,之后将会开启新的技术栈讲解。

转载请注明出处:https://guangzai.blog.csdn.net/article/details/143406501

相关推荐
墨城烟柳Q9 分钟前
自动化爬虫-selenium模块万字详解
爬虫·python·selenium·自动化
raoxiaoya12 分钟前
python安装selenium,geckodriver,chromedriver
开发语言·python·selenium
Dxy12393102161 小时前
python使用requests发送请求ssl错误
开发语言·python·ssl
gxchai1 小时前
利用pythonstudio写的PDF、图片批量水印生成器,可同时为不同读者生成多组水印
python
ao_lang1 小时前
剑指offer第五天
python·算法·cpp
这个男人是小帅1 小时前
【GCN】 代码详解 (1) 如何运行【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类
python1562 小时前
Python Pandas内存管理技巧助力高效处理大数据
大数据·python·pandas
Python大数据分析@2 小时前
学习python中的pandas有没有好的教程推荐?
python·学习·pandas
哪 吒2 小时前
华为OD机试 - 无重复字符的元素长度乘积的最大值(Python/JS/C/C++ 2024 C卷 100分)
javascript·python·华为od
科研小达人3 小时前
Langchain调用模型使用FAISS
python·chatgpt·langchain·faiss