【100天精通Python】Day60:Python 数据分析_Pandas高级功能-数据透视表pivot_table()和数据交叉表crosstab()常用功能和操作

简介: 【100天精通Python】Day60:Python 数据分析_Pandas高级功能-数据透视表pivot_table()和数据交叉表crosstab()常用功能和操作

1 数据透视表和交叉表pivot_table(),crosstab()

  • 数据透视表:使用 pivot_table() 方法,你可以根据一个或多个列的值对数据进行汇总和分析。你可以指定哪些列作为索引,哪些列作为值,以及如何进行聚合计算。
  • 交叉表:使用 pd.crosstab() 函数,你可以计算两个或多个因素之间的交叉频率,特别适用于分类数据的汇总分析。

数据透视表和交叉表示例:

import pandas as pd
# 创建一个示例DataFrame
data = {'Category': ['A', 'B', 'A', 'B', 'A'],
        'Value1': [10, 15, 20, 25, 30],
        'Value2': [100, 150, 200, 250, 300]}
df = pd.DataFrame(data)
# 创建数据透视表
pivot_table = pd.pivot_table(df, values=['Value1', 'Value2'], index='Category', aggfunc='sum')
# 创建交叉表
cross_table = pd.crosstab(df['Category'], df['Value1'])
print("数据透视表:")
print(pivot_table)
print("\n交叉表:")
print(cross_table)

2  Pandas数据透视表常用操作

       Pandas 的数据透视表(Pivot Table)提供了丰富的高级选项,允许你自定义数据的汇总方式、聚合函数、行和列的顺序等。以下是一些常见的高级选项示例:

2.1 自定义聚合函数

      默认情况下,pivot_table() 使用平均值作为聚合函数。但你可以使用 aggfunc 参数来指定自定义的聚合函数,例如 sumcountmaxmin 等,甚至可以传递自己编写的函数。

import pandas as pd
# 创建一个示例DataFrame
data = {'Category': ['A', 'A', 'B', 'B', 'A', 'A'],
        'Value': [10, 20, 15, 25, 5, 10]}
df = pd.DataFrame(data)
# 创建数据透视表,使用自定义聚合函数计算总和
pivot_table = pd.pivot_table(df, values='Value', index='Category', aggfunc='sum')
print(pivot_table)

输出:

2.2 指定多个聚合函数

你可以同时指定多个聚合函数,以便在数据透视表中显示多个统计结果。

import pandas as pd
# 创建一个示例DataFrame
data = {'Category': ['A', 'A', 'B', 'B', 'A', 'A'],
        'Value': [10, 20, 15, 25, 5, 10]}
df = pd.DataFrame(data)
# 创建数据透视表,同时计算总和和平均值
pivot_table = pd.pivot_table(df, values='Value', index='Category', aggfunc={'Value': ['sum', 'mean']})
print(pivot_table)

输出:

2.3 处理缺失值

你可以使用fill_value 参数来指定如何处理数据透视表中的缺失值(NaN)。

import pandas as pd
import numpy as np
# 创建一个示例DataFrame,包含缺失值
data = {'Category': ['A', 'A', 'B', 'B', 'A', 'A'],
        'Value': [10, np.nan, 15, 25, np.nan, 10]}
df = pd.DataFrame(data)
# 创建数据透视表,指定如何处理缺失值
pivot_table = pd.pivot_table(df, values='Value', index='Category', aggfunc=np.mean, fill_value=0)
print(pivot_table)

       在这个示例中,我们使用 np.NaN 表示缺失值,然后通过 fill_value=0 参数告诉 pivot_table 在计算平均值时将缺失值替换为0。这将产生一个数据透视表,其中缺失值已被替换为0,并计算了平均值。

2.4 更改行和列的顺序

       在 Pandas 中,你可以使用不同的方法来更改行和列的顺序,具体取决于你的需求。以下是一些示例:

更改行的顺序:

(a)使用 reindex() 方法:reindex() 方法允许你按照特定的顺序重新排列DataFrame的行。

import pandas as pd
# 创建一个示例DataFrame
data = {'A': [1, 2, 3],
        'B': [4, 5, 6]}
df0 = pd.DataFrame(data)
# 指定新的行顺序
new_order = [2, 0, 1]
# 使用reindex()重新排列行
df1 = df0.reindex(new_order)
print("df0 \n", df0)
print( "df1\n", df1)

输出:

(b)使用 iloc 属性:iloc 属性允许你按照整数位置选择行,并以指定的顺序重新排列它们。

import pandas as pd
# 创建一个示例DataFrame
data = {'A': [1, 2, 3],
        'B': [4, 5, 6]}
df = pd.DataFrame(data)
# 指定新的行顺序
new_order = [2, 0, 1]
# 使用iloc重新排列行
df = df.iloc[new_order]
print(df)

输出:

更改列的顺序:

(a)使用列名列表:你可以使用列名列表以所需的顺序重新排列DataFrame的列。

import pandas as pd
# 创建一个示例DataFrame
data = {'A': [1, 2, 3],
        'B': [4, 5, 6]}
df = pd.DataFrame(data)
# 指定新的列顺序
new_order = ['B', 'A']
# 重新排列列
df = df[new_order]
print(df)

输出:

(b)使用 reindex() 方法:你也可以使用 reindex() 方法来重新排列列,但要指定axis=1

import pandas as pd
# 创建一个示例DataFrame
data = {'A': [1, 2, 3],
        'B': [4, 5, 6]}
df = pd.DataFrame(data)
# 指定新的列顺序
new_order = ['B', 'A']
# 使用reindex()重新排列列
df = df.reindex(columns=new_order)
print(df)

输出:

2.5 重新排列多层索引

reorder_levels() 是 Pandas 中用于重新排列多层索引(MultiIndex)级别的方法。它允许你更改多层索引的层次顺序,以适应不同的需求。以下是关于 reorder_levels() 的详细解释和示例:

reorder_levels() 方法的语法:

DataFrame.reorder_levels(order, axis=0)

参数说明:

  • order:一个整数列表或元组,表示你希望将多层索引的哪些级别移动到前面。这里的整数是级别的位置,从0开始。例如,如果你的多层索引有两个级别(0和1),你可以使用 [1, 0] 来交换这两个级别的顺序。
  • axis:指定要重新排序级别的轴,0 表示行索引,1 表示列索引。

示例:

让我们通过一个示例来了解如何使用 reorder_levels() 方法:

import pandas as pd
# 创建一个示例DataFrame
data = {'Category1': ['A', 'A', 'B', 'B', 'A', 'A'],
        'Category2': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
        'Value': [10, 20, 15, 25, 5, 10]}
df = pd.DataFrame(data)
# 将多层索引设置为行索引
df.set_index(['Category1', 'Category2'], inplace=True)
# 输出原始DataFrame
print("原始DataFrame:")
print(df)
# 使用reorder_levels()重新排列多层索引
df_reordered = df.reorder_levels([1, 0], axis=0)
# 输出重新排列后的DataFrame
print("\n重新排列后的DataFrame:")
print(df_reordered)

      在这个示例中,我们首先将多层索引设置为行索引。然后,我们使用 reorder_levels([1, 0], axis=0) 将索引级别重新排列,将 "Category2" 放在前面,然后 "Category1"。

输出:

3 数据交叉表常用功能

3.1 计算频率表

       最基本的用法是计算两个或多个因素的交叉频率。例如,你可以使用交叉表来计算性别与职业的分布情况。

import pandas as pd
# 创建一个示例DataFrame
data = {'Gender': ['Male', 'Female', 'Male', 'Female', 'Male'],
        'Occupation': ['Engineer', 'Doctor', 'Doctor', 'Engineer', 'Doctor']}
df = pd.DataFrame(data)
# 创建交叉表
cross_table = pd.crosstab(df['Gender'], df['Occupation'])
print("交叉频率表:")
print(cross_table)

使用 pd.crosstab() 函数来创建交叉频率表。在这个函数中,你传递了两个参数:

  • df['Gender']:这是要分析的第一个分类变量,表示性别。
  • df['Occupation']:这是要分析的第二个分类变量,表示职业。
  • 结果表格的行表示性别(Male 和 Female),列表示职业(Engineer 和 Doctor),每个单元格中的值表示相应性别和职业组合的数量。显示了示例数据中性别和职业的分布情况。

3.2 计算百分比表

       你可以将 normalize 参数设置为 True,以计算百分比表,显示每个单元格的相对频率而不是绝对频率。

cross_table = pd.crosstab(df['Gender'], df['Occupation'], normalize=True)
print("百分比表:")
print(cross_table)

       创建交叉表并计算百分比表:使用 pd.crosstab() 函数创建交叉频率表,但在此次使用了 normalize=True 参数。这个参数的作用是将表格中的值转换为相对频率(百分比)。这意味着每个单元格中的值表示相应性别和职业组合的相对频率,而不是绝对数量。 每个单元格中的值表示相应性别和职业组合的百分比。

输出结果:

3.3 使用 margins 参数计算边际频率

你可以通过将 margins 参数设置为 True 来计算边际频率,这将在表中添加行和列的边际总计。

cross_table = pd.crosstab(df['Gender'], df['Occupation'], margins=True)
print("边际频率表:")
print(cross_table)

       创建交叉表并计算边际频率表:使用 pd.crosstab() 函数创建交叉频率表,但在此次使用了 margins=True 参数。这个参数的作用是在表格中添加行和列的边际总计。这将在结果表格的右侧和底部分别添加边际总计行和列。 边际总计行显示了每个性别的总数量,边际总计列显示了每个职业的总数量

3.4 使用 values 参数进行加权计算

如果你有一个权重列,可以使用 values 参数来执行加权计算。

data = {'Gender': ['Male', 'Female', 'Male', 'Female', 'Male'],
        'Occupation': ['Engineer', 'Doctor', 'Doctor', 'Engineer', 'Doctor'],
        'Weight': [150, 160, 140, 170, 155]}
df = pd.DataFrame(data)
# 创建交叉表,使用Weight列进行加权计算
cross_table = pd.crosstab(df['Gender'], df['Occupation'], values=df['Weight'], aggfunc='sum')
print("加权交叉频率表:")
print(cross_table)

3.5 自定义聚合函数

        你可以使用 aggfunc 参数指定自定义聚合函数,例如 np.meannp.sumlambda x: x.max() - x.min() 等。

import numpy as np
# 创建交叉表,使用自定义聚合函数
cross_table = pd.crosstab(df['Gender'], df['Occupation'], values=df['Weight'], aggfunc=np.mean)
print("自定义聚合函数交叉频率表:")
print(cross_table)

创建交叉表并使用自定义聚合函数:使用 pd.crosstab() 函数创建交叉频率表,但在此次的参数中使用了 values 和 aggfunc。具体如下:

  • df['Gender']:指定要分析的第一个分类变量,表示性别。
  • df['Occupation']:指定要分析的第二个分类变量,表示职业。
  • values=df['Weight']:将 Weight 列作为值变量,这意味着我们将在交叉表中应用自定义聚合函数到 Weight 列上。
  • aggfunc=np.mean:指定自定义聚合函数为 NumPy 中的均值函数 np.mean,这将计算每个性别和职业组合的体重均值。

交叉频率表中每个单元格中的值表示相应性别和职业组合的体重均值。

输出:

目录
相关文章
|
5月前
|
数据采集 数据可视化 数据挖掘
用 Excel+Power Query 做电商数据分析:从 “每天加班整理数据” 到 “一键生成报表” 的配置教程
在电商运营中,数据是增长的关键驱动力。然而,传统的手工数据处理方式效率低下,耗费大量时间且易出错。本文介绍如何利用 Excel 中的 Power Query 工具,自动化完成电商数据的采集、清洗与分析,大幅提升数据处理效率。通过某美妆电商的实战案例,详细拆解从多平台数据整合到可视化报表生成的全流程,帮助电商从业者摆脱繁琐操作,聚焦业务增长,实现数据驱动的高效运营。
|
4月前
|
SQL 数据挖掘 BI
数据分析的尽头,是跳出数据看数据!
当前许多企业在数据分析上投入大量资源,却常陷入“数据越看越细,业务越看越虚”的困境。报表繁杂、指标众多,但决策难、行动少,分析流于形式。真正有价值的数据分析,不在于图表多漂亮,而在于能否带来洞察、推动决策、指导行动。本文探讨如何跳出数据、回归业务场景,实现数据驱动的有效落地。
|
10月前
|
SQL 人工智能 数据可视化
数据团队必读:智能数据分析文档(DataV Note)五种高效工作模式
数据项目复杂,涉及代码、数据、运行环境等多部分。随着AI发展,数据科学团队面临挑战。协作式数据文档(如阿里云DataV Note)成为提升效率的关键工具。它支持跨角色协同、异构数据处理、多语言分析及高效沟通,帮助创建知识库,实现可重现的数据科学过程,并通过一键分享报告促进数据驱动决策。未来,大模型AI将进一步增强其功能,如智能绘图、总结探索、NLP2SQL/Python和AutoReport,为数据分析带来更多可能。
604 142
|
11月前
|
SQL 数据可视化 大数据
从数据小白到大数据达人:一步步成为数据分析专家
从数据小白到大数据达人:一步步成为数据分析专家
600 92
|
12月前
|
存储 数据采集 数据可视化
Pandas数据应用:电子商务数据分析
本文介绍如何使用 Pandas 进行电子商务数据分析,涵盖数据加载、清洗、预处理、分析与可视化。通过 `read_csv` 等函数加载数据,利用 `info()` 和 `describe()` 探索数据结构和统计信息。针对常见问题如缺失值、重复记录、异常值等,提供解决方案,如 `dropna()`、`drop_duplicates()` 和正则表达式处理。结合 Matplotlib 等库实现数据可视化,探讨内存不足和性能瓶颈的应对方法,并总结常见报错及解决策略,帮助提升电商企业的数据分析能力。
494 73
|
11月前
|
存储 数据采集 数据可视化
Pandas数据应用:医疗数据分析
Pandas是Python中强大的数据操作和分析库,广泛应用于医疗数据分析。本文介绍了使用Pandas进行医疗数据分析的常见问题及解决方案,涵盖数据导入、预处理、清洗、转换、可视化等方面。通过解决文件路径错误、编码不匹配、缺失值处理、异常值识别、分类变量编码等问题,结合Matplotlib等工具实现数据可视化,并提供了解决常见报错的方法。掌握这些技巧可以提高医疗数据分析的效率和准确性。
337 22
|
9月前
|
机器学习/深度学习 传感器 数据采集
基于机器学习的数据分析:PLC采集的生产数据预测设备故障模型
本文介绍如何利用Python和Scikit-learn构建基于PLC数据的设备故障预测模型。通过实时采集温度、振动、电流等参数,进行数据预处理和特征提取,选择合适的机器学习模型(如随机森林、XGBoost),并优化模型性能。文章还分享了边缘计算部署方案及常见问题排查,强调模型预测应结合定期维护,确保系统稳定运行。
916 0
|
2月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
277 0
|
2月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
442 0
|
4月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
402 0