一文搞懂Pandas数据透视的4个函数的使用

  • Post category:Python

一文搞懂Pandas数据透视的4个函数的使用

本文将介绍Pandas库的数据透视技术,以及使用其中4个函数进行数据透视的方法。通过本文,你可以了解到:

  • 数据透视的概念和作用
  • 数据透视的常见用法
  • 使用Pandas库中的pivot_table()、crosstab()、groupby()和melt()函数进行数据透视的方法及其区别

什么是数据透视

数据透视是一种数据分析技术,它可以将一个数据集的某些特征按照另外一些特征进行汇总并展示,以便更加直观地显示数据的规律性和趋势性。在实际应用中,我们通常会根据数据集中的某些特征生成一张表格,其中表格的每一行是某些特征的取值情况,而表格的每一列则是另外一些特征的取值情况,表格中的每个单元格则是某些变量的聚合函数(例如总和、平均数等)的结果。

常见的数据透视方法

常见的数据透视方法有3种:

  • 数据透视表(Pivot Table)
  • 交叉表(Crosstab)
  • 分组数据(Groupby)

这3种数据透视方法各自的特点如下:

  • 数据透视表:旨在展示一个或多个变量(列)对某个或多个指定变量(行)的影响,它可以简单理解为多列条件下的单行聚合计算。
  • 交叉表:也称为列联表,一般用于统计分析中,它的用途是根据给定的数据构成一个多维频率表,用于展示其中某些特征之间的关系。
  • 分组数据:将数据集中的所有数据按照指定的一些特征进行分组,然后对每个分组进行一些操作(例如计数、取平均数等),最后将结果合并成一个新的数据集。

Pandas库中的数据透视函数

Pandas库中有4个函数可以用于进行数据透视操作,分别是:

  • pivot_table()
  • crosstab()
  • groupby()
  • melt()

下面详细介绍这4个函数的使用方法和区别。

pivot_table()函数的使用

pivot_table()函数可以用于创建一个数据透视表,语法如下:

pivot_table(data, values=None, index=None, columns=None,
            aggfunc='mean', fill_value=None, margins=False,
            dropna=True, margins_name='All')
  • data:一个DataFrame对象,表示要进行数据透视的数据集。
  • values:可选参数,表示要聚合的变量,可以指定多个变量(使用列表形式)。
  • index:一个或多个列名或者一个数组,指定要分组的行变量。
  • columns:一个或多个列名或者一个数组,指定要分组的列变量。
  • aggfunc:一个字符串、字符串列表或者可调用对象,表示聚合函数的类型,例如’mean’、’sum’、’count’等。
  • fill_value:一个标量或者字典,表示如何填充缺失值。
  • margins:布尔型,表示是否在结果中添加所有行/列的小计。
  • dropna:布尔型,表示是否删除包含空值的行/列。
  • margins_name:用于指定margins的列/行名称,缺省为”All”。

下面是一个pivot_table()函数的示例:

import pandas as pd

df = pd.read_csv('sales.csv')   # 读取数据集
table = pd.pivot_table(df, 
                       values='Sales', 
                       index='Region', 
                       columns='Year', 
                       aggfunc=sum)
print(table)   # 显示结果

这个示例中,我们首先使用read_csv()方法从一个CSV文件中读取了一个数据集,然后使用pivot_table()方法计算了每个地区和每个年份的总销售额,结果以数据透视表的形式展示出来。

crosstab()函数的使用

crosstab()函数也可以用于创建一个数据透视表,但与pivot_table()函数不同的是,它更适合于统计分析任务。crosstab()函数的语法如下:

pandas.crosstab(index, columns, values=None, aggfunc=None, 
                rownames=None, colnames=None, 
                margins=False, margins_name='All', 
                dropna=True, normalize=False)
  • index:一个或多个列名或数组,作为行变量进行汇总。
  • columns:一个或多个列名或数组,作为列变量进行汇总。
  • values:可选参数,指定要聚合的变量,可以指定多个变量(使用列表形式)。
  • aggfunc:一个字符串、字符串列表或者可调用对象,表示聚合函数的类型,例如’mean’、’sum’、’count’等。
  • rownames:一个数组,表示行变量的名称,指定为不同的标签或者None。
  • colnames:一个数组,表示列变量的名称,指定为不同的标签或者None。
  • margins:布尔型,表示是否在结果中添加所有行/列的小计。
  • dropna:布尔型,表示是否删除包含空值的行/列。
  • margins_name:用于指定margins的列/行名称,缺省为”All”。
  • normalize:布尔型,表示是否对结果进行归一化。

下面是一个crosstab()函数的示例:

import pandas as pd

df = pd.read_csv('sales.csv')   # 读取数据集
table = pd.crosstab(df['Region'], df['Year'],  
                    values=df['Sales'], aggfunc=sum)  
print(table)   # 显示结果

与前一个示例类似,这个示例也是计算每个地区和每个年份的总销售额,但这里使用了crosstab()函数来实现。需要注意的是,这里的行和列变量都是从数据集中的df对象中取得的,values和aggfunc参数则表示采用sum函数进行计算。

groupby()函数的使用

groupby()函数是Pandas库中最常用的分组函数之一,它用于将数据集中的所有数据按照指定的一些特征进行分组,然后对每个分组进行一些操作(例如计数、取平均数等),最后将结果合并成一个新的数据集。groupby()函数的语法如下:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, 
              group_keys=True, squeeze=False, observed=False, dropna=True)
  • by:一个string、list或者array,表示进行分组的列名或者列名的列表。
  • axis:表示进行分组操作的轴(0表示行,1表示列)。
  • level:如果轴是一个多层索引的(单列),则为分组的级别。
  • as_index:布尔型,表示是否将分组的列作为索引。
  • sort:布尔型,表示是否对分组结果进行排序。
  • group_keys:布尔型,表示是否将组名作为键添加到聚合结果中。
  • squeeze:布尔型,表示是否将单个分组的结果作为Series。
  • observed:仅在使用分类数据时有效。如果为True,则仅返回观察到的类别值。
  • dropna:布尔型,表示是否删除包含空值的行/列。

下面是一个groupby()函数的示例:

import pandas as pd

df = pd.read_csv('sales.csv')   # 读取数据集
group = df.groupby(['Region', 'Year'])['Sales'].sum()
print(group)   # 显示结果

这个示例中,我们使用了groupby()函数将数据按照地区和年份分组,然后计算了每个分组中销售额的总和。

melt()函数的使用

有时候需要将数据透视表或数据透视图转化成长格式,这时可以使用melt()函数实现。melt()函数的语法如下:

pandas.melt(frame, id_vars=None, value_vars=None, var_name=None,
             value_name='value', col_level=None, ignore_index=True)
  • frame:DataFrame对象,表示要进行操作的数据集。
  • id_vars:一个或多个列名或数组,表示要保留的列。
  • value_vars:一个或多个列名或数组,表示要作为值变量的列。
  • var_name:scalar,表示自定义汇总值名称的名称。
  • value_name:scalar,表示要添加的列的名称。
  • col_level:int或字符串,如果列是多层索引中的,则使用此级别。
  • ignore_index:布尔型,表示是否忽略索引唯一性检查。

下面是一个melt()函数的示例:

import pandas as pd

df = pd.read_csv('sales.csv')   # 读取数据集
table = pd.pivot_table(df, 
                       values='Sales', 
                       index='Region', 
                       columns='Year', 
                       aggfunc=sum)
melt_data = pd.melt(table.reset_index(), 
                    id_vars=['Region'], 
                    value_vars=['2015', '2016', '2017'], 
                    var_name='Year', 
                    value_name='Sales')
print(melt_data)   # 显示结果

在这个示例中,我们首先使用pivot_table()函数计算出了每个地区在每个年份的总销售额,然后使用melt()函数将数据透视表转换成了”长格式”,这样我们就可以更方便地进行数据分析和可视化处理了。

总结

本文介绍了Pandas库中4个数据透视函数的使用方法:pivot_table()、crosstab()、groupby()和melt()。每个函数都有其独特的应用场景和用法,读者可以按照实际需求选择不同的函数进行数据透视操作。