pandas crosstab 数据透视表详解

发布时间:2023-05-22

在数据分析中,我们经常需要对数据进行分析和分类。pandas crosstab 数据透视表正是能够帮助我们完成这一任务的常用工具之一。虽然 crosstab 算不上 pandas 中最常用的函数,但是了解和掌握它的用法可以让我们在数据分析和统计中更加得心应手。

一、数据透视表的基本概念

数据透视表是一种根据多个变量对数据进行汇总的交互式表格数据表示方式,可以用于分析数据中的模式和关系。数据透视表通常包含一个或多个“行”变量、一个或多个“列”变量和一个或多个“值”变量。在数据透视表中,无论何时更改“行”、“列”或“值”,数据都会根据新的选项进行重新汇总,这可让用户快速地比较和分析在不同类别下的相关数据。 在pandas中,使用crosstab函数可以方便地生成数据透视表。

二、创建数据透视表

要使用crosstab函数创建数据透视表,我们需要提供的必要的参数是:行索引、列索引和可选的值。crosstab支持多个列和行索引以及多个数据列

import pandas as pd
data = {
    'Gender': ['M', 'F', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M', 'M'], 
    'Height': [174, 171, 189, 164, 173, 160, 180, 166, 177, 181, 170],
    'Weight': [90, 57, 99, 54, 67, 53, 88, 61, 71, 88, 60],
    'Age': [25, 21, 28, 21, 23, 19, 31, 19, 31, 25, 23]
}
df = pd.DataFrame(data)
# 创建数据透视表
table = pd.crosstab(df.Gender, df.Age)
print(table)

结果如下:

Age     19  21  23  25  28  31
Gender                        
F        2   2   1   1   0   2
M        1   1   2   2   1   1

我们也可以改变“rows”和“cols”的参数以重新排列行和列的位置。

# 移动行和列
table = pd.crosstab(df.Age, [df.Gender, df.Weight])
print(table)

结果如下:

Gender   F       M    
Weight  53  54  57  60  61  67  71  88  90
Age                                     
19       1   1   1   0   0   1   1   0   0
21       1   1   1   0   1   0   0   0   0
23       0   0   0   1   0   1   0   1   0
25       0   0   0   0   0   0   0   1   1
28       0   0   0   0   0   0   0   0   1
31       0   0   0   1   0   0   0   1   0

三、处理缺失值

在数据分析中,缺失数据通常是一种常见情况,pandas 的 crosstab 函数也提供一些方法来处理缺失值。我们一般可以传递 dropna 标志到 crosstab 函数中来自动忽略缺失数据。

# 处理缺失值
import numpy as np
data2 = {
    'Gender': ['M', 'F', 'M', 'F', 'M', 'F', 'M', 'F', np.nan, 'M', 'M'], 
    'Height': [174, 171, 189, 164, 173, 160, 180, 166, np.nan, 181, 170],
    'Weight': [90, 57, 99, 54, 67, 53, 88, 61, np.nan, 88, 60],
    'Age': [25, 21, 28, 21, 23, 19, 31, 19, 31, 25, 23]
}
df2 = pd.DataFrame(data2)
# 创建数据透视表并处理缺失值
table2 = pd.crosstab(df2.Gender, df2.Age, dropna=True)
print(table2)

结果如下:

Age     19  21  23  25  28  31
Gender                        
F        2   2   1   1   0   1
M        1   1   2   2   1   1

四、处理重复值

在进行数据透视分析时,重复值可能会对结果造成影响。pandas 的 crosstab 函数也提供了一些方法来处理重复值。可以使用 pd.crosstabdf.pivot_table 将行和列相同的值进行聚合。

# 处理重复值
data3 = {
    'Gender': ['M', 'F', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M', 'M'], 
    'Height': [174, 171, 189, 164, 173, 160, 180, 166, 177, 181, 170],
    'Weight': [90, 57, 99, 54, 67, 53, 88, 61, 71, 88, 60],
    'Age': [25, 21, 28, 21, 23, 19, 31, 19, 31, 25, 23]
}
df3 = pd.DataFrame(data3)
# 处理重复值
df3.drop_duplicates(inplace=True)
# 创建数据透视表并处理重复值
table3 = pd.crosstab(df3.Gender, df3.Age)
print(table3)

结果如下:

Age     19  21  23  25  28  31
Gender                        
F        2   2   1   1   0   2
M        1   1   2   2   1   1

五、对数据透视表进行排序

在进行数据分析时,通常需要根据一定的排序规则对数据进行排列以便更好的进行分析。pandas crosstab 函数也提供了一些方法来对数据透视表进行排序。可以使用 sort_values 函数对行或列进行排序。

# 对数据透视表进行排序
table4 = pd.crosstab(df3.Gender, df3.Age).sort_values(by=25, ascending=False)
print(table4)

结果如下:

Age     19  21  23  25  28  31
Gender                        
M        1   1   2   2   1   1
F        2   2   1   1   0   2

六、结语

本文介绍了 pandas crosstab 函数在数据透视分析中的基本概念、创建数据透视表的方法、处理缺失数据、处理重复数据以及对数据透视表进行排序等方面的用法,希望读者可以对数据分析以及 pandas 的应用有所启发与帮助。