数据透视表是一种分类汇总数据的方法。在 Python 中,我们可以使用 Pandas 库中的pivot_table 函数来创建和操作数据透视表,相比Excel,Python可以更多更快的处理数据。

一、数据

首先,引入几个重要的包:

import pandas as pd
import numpy as np
from pandas import DataFrame,Series

通过代码构造数据集,创建一个DataFrame对象,作为数据源:

data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'],
        'Gender': ['Female', 'Male', 'Male', 'Male', 'Female'],
        'Age': [25, 30, 35, 40, 45],
        'City': ['Beijing', 'Shanghai', 'Beijing', 'Shanghai', 'Beijing'],
        'Salary': [5000, 6000, 7000, 8000, 9000]}
df = pd.DataFrame(data)

得到数据如下:

Name  Gender  Age      City  Salary
0    Alice  Female   25   Beijing    5000
1      Bob    Male   30  Shanghai    6000
2  Charlie    Male   35   Beijing    7000
3    David    Male   40  Shanghai    8000
4    Emily  Female   45   Beijing    9000

二、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:每个pivot_table必须拥有一个index,必选参数,设定数据的行索引,可以设置多层索引,多次索引时按照需求确定索引顺序。

columns:必选参数,设定列索引,用来显示字符型数据,和fill_value搭配使用。

aggfunc:聚合函数, pivot_table后新dataframe的值都会通过aggfunc进行运算。默认numpy.mean求平均。

fill_values:填充NA值(设定缺失值)。默认不填充,可以指定。

margins:添加行列的总计,默认FALSE不显示。TRUE显示。

dropna:如果整行都为NA值,则进行丢弃,默认TRUE丢弃。FALSE时,被保留。

margins_name:margins = True 时,设定margins 行/列的名称。‘all’ 默认值

三、按照不同类进行计数统计

为了结算每个城市不同性别的平均收入,我们可以利用pivot_table函数进行统计:

pt1 = df.pivot_table(index='City', columns='Gender', values='Salay', aggfunc='mean')

结果如下:

Gender    Female    Male
City                    
Beijing   7000.0  7000.0
Shanghai     NaN  7000.0

如果要知道每个城市不同性别的总收入,只需要设定aggfunc函数为sum进行求和:

pt2 = df.pivot_table(index='City', columns='Gender', values='Salary', aggfunc='sum')

结果如下:

Gender     Female     Male
City                      
Beijing   14000.0   7000.0
Shanghai      NaN  14000.0

可以看到这两个数据透视表是有缺失值的,pivot_table有一个参数fill_value,就是用来填充这些缺失值的。而pivot_table方法还支持对透视表进行统计计算,而且会新建一个列来存放计算结果。这个统计需要用到以下两个参数:

● margins,设定是否添加汇总列,一般设置为True。

● margins_name,汇总列的名称。

代码示例:

pt3 = df.pivot_table(index='City', columns='Gender', values='Salary', fill_value=0, aggfunc='sum', margins=True, margins_name="汇总")

结果如下:

Gender    Female   Male     汇总
City                          
Beijing    14000   7000  21000
Shanghai       0  14000  14000
汇总         14000  21000  35000

四、筛选数据透视表中的数据

pivot_table的运算结果是一个DataFrame类型,所以可以用DataFrame截取数据的方法筛选数据透视表中的数据。本节用于示例的数据透视表如下:

Gender    Female   Male     汇总
City                          
Beijing    14000   7000  21000
Shanghai       0  14000  14000
汇总         14000  21000  35000

(1)仅保留汇总列的数据。

pt['汇总']

结果是一个Series,如下所示。

City
Beijing     21000
Shanghai    14000
汇总          35000
Name: 汇总, dtype: int64

(2)获取男性和女性的汇总数据。

pt[['Female', 'Male']]

结果如下:

Gender    Female   Male
City                   
Beijing    14000   7000
Shanghai       0  14000
汇总         14000  21000

五、使用字段列表排列数据透视表中的数据

数据透视表是一个DataFrame,所以可以用sort_values方法来按某列排序,示例代码如下:

pt3 = df.pivot_table(index='City', columns='Gender', values='Salary', fill_value=0, aggfunc='sum', margins=True, margins_name="汇总")
pt3.sort_values(by="汇总")

结果如下:

Gender    Female   Male     汇总
City      
Shanghai       0  14000  14000              
Beijing    14000   7000  21000
汇总         14000  21000  35000

以上就是用Python构造数据透视表的内容介绍。数据透视表是数据分析中非常重要的工具,掌握它可以让你更加高效地进行数据处理和可视化呈现。