首页 > pandas 阅读数:30

pandas交叉分析

< 上一页pandas分布分析 pandas结构分析下一页 >
交叉分析通常用于分析两个或两个以上分组变量之间的关系,以交叉表形式进行变量间关系的对比分析;从数据的不同维度,综合进行分组细分,进一步了解数据的构成、分布特征。

透视表

交叉分析有数据透视表和交叉表两种,其中,pivot_table() 函数返回值是数据透视表的结果,该函数相当于 Excel 中的数据透视表功能。

pivot_table() 函数的语法格式如下:

pandas.pivot_table(data, values, index, columns, aggfunc, fill_value, margins)

dataframe.pivot_table(values, index, columns, aggfunc, fill_value, margins)

函数中的参数说明如下:
  • data:要应用透视表的数据框;
  • values:待聚合的列的名称,默认聚合所有数值列;
  • index:用于分组的列名或其他分组键,出现在结果透视表的行;
  • columns:用于分组的列名或其他分组键,出现在结果透视表的列;
  • aggfunc:聚合函数或函数列表,默认为 'mean',可以是任何对 groupby 有效的函数;
  • fill_value:用于替换结果表中的缺失值;
  • margins:添加行/列小计和总计,默认为 False。

在交叉分析时,可先用 cut() 函数确定交叉分析中的分层,然后再利用 pivot_table() 函数实现交叉分析。

【例 1 】对 Employee_income.xls 文件中的数据进行下列交叉分析。
(1)对年龄(age)和性别(sex)数据列进行交叉分析,求解不同年龄段中不同性别的人数。
(2)对年龄(age)和学历(education)数据列进行交叉分析,求解不同年龄段中不同学历员工的平均月薪。

其示例代码 test1 如下。
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
df = pd.read_excel('d:\data\emp_income\Employee_income.xls',
                   sheet_name='emp_income')
#年龄分布状况
age_bins = [20,30,40,50,60,70]
age_labels = ['20-29岁', '30-39岁', '40-49岁', '50-59岁','60-69岁']
df['年龄分层']=pd.cut(df.age, age_bins, right=False, labels=age_labels)
#求不同年龄段中不同性别的人数年龄分布状况
ptResult1 = df.pivot_table(
    values=['age'],
    index=['年龄分层'],
    columns=['sex'],
    aggfunc=[np.size]
)
print(ptResult1)
#求不同年龄段中不同学历的平均月薪
ptResult2 = df.pivot_table(
    values=['salary'],
    index=['年龄分层'],
    columns=['education'],
    aggfunc=[np.mean]
)
print(ptResult2)

运行输出结果如下。
sex      女    男
年龄分层
20-29岁  3.0  3.0
30-39岁  5.0  6.0
40-49岁  NaN  1.0
          mean
         salary
education     大专    本科   研究生       高中
年龄分层
20-29岁     3400.0     NaN     NaN  2500.000000
30-39岁     4000.0  4700.0  6500.0  2933.333333
40-49岁        NaN     NaN  7699.0          NaN

交叉表

交叉表(Cross-Tabulation,简称 crosstab)是一种用于计算分组频率的特殊透视表。

交叉表 crosstab() 函数的语法格式如下:

pandas.crosstab(index, columns,values=None,rownames=None,colnames=None,
                          aggfunc=None,margins=False,margins_name='All',dropna=True,normalize=False)

函数中的参数说明如下:
  • index:接收 array、Series 或数组列表,表示要在行中分组的值;
  • columns:接收 array、Series 或数组列表,表示要在列中分组的值;
  • values:接收 array,可选。根据因素聚合的值数组。需要指定“aggfunc”;
  • rownames:接收 sequence,默认为 None。如果传递,则必须匹配传递的行数组;
  • colnames:接收 sequence,默认为 None。如果传递,则必须匹配传递的列数组;
  • aggfunc:聚合函数或函数列表;
  • margins:添加行/列小计和总计,默认为 False;
  • margins_name:接收 string,默认为 'All',表示包含总计的行/列的名称。

【例 2 】利用交叉表分析 Employee_income.xls 文件中的不同性别的学历人数。

其示例代码 test2 如下。
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
df = pd.read_excel('d:\data\emp_income\Employee_income.xls',sheet_name='emp_income')
# 按性别(sex)分组,统计各个分组中学历的频数
ctResult = pd.crosstab(df['sex'], df['education'], margins=True)
print(ctResult)

运行输出结果如下。
education  大专  本科 研究生   高中  All
sex
女          3     2     0     3     8
男          1     3     2     4    10
All         4     5     2     7    18
总而言之,在交叉分析中,透视表 pivot_table() 是一种进行分组统计的函数,参数 aggfunc 决定统计类型;而交叉表 crosstab() 是一种特殊的 pivot_table(),专门用于计算分组的频率。
< 上一页pandas分布分析 pandas结构分析下一页 >