41_Pandas使用数据透视表计算每个类别的统计信息

41_Pandas使用数据透视表计算每个类别的统计信息

通过使用pandas.pivot_table()函数,可以实现与电子表格软件(例如Excel)的数据透视表功能相同的处理。

可以通过对分类数据的每个类别(分类数据,定性数据)进行分组(分组)来检查和分析定量数据统计信息(平均值,总计,最大值,最小值,标准差等)。
分别准备了一个名为pandas.crosstab()的函数,以汇总每个类别的出现次数和频率(也可以使用pivot_table())。

这里,将对以为内容予以描述。

  • pandas.pivot_table()函数的基本用法
  • 计算每个类别的小计/总计:参数边距
  • 指定如何计算结果值:参数aggfunc
  • 指定是否排除原始数据的缺失值NaN:参数dropna

我们将以泰坦尼克号的生存信息数据为例。

import numpy as np
import pandas as pd

df = pd.read_csv('./data/41/train.csv', index_col=0).drop(['Name', 'Ticket', 'SibSp', 'Parch'], axis=1)

print(df.head())
#              Survived  Pclass     Sex   Age     Fare Cabin Embarked
# PassengerId
# 1                   0       3    male  22.0   7.2500   NaN        S
# 2                   1       1  female  38.0  71.2833   C85        C
# 3                   1       3  female  26.0   7.9250   NaN        S
# 4                   1       1  female  35.0  53.1000  C123        S
# 5                   0       3    male  35.0   8.0500   NaN        S

pandas.pivot_table()函数的基本用法

pandas.pivot_table()函数需要以下三个参数。

  • data(第一个参数):指定原始数据的pandas.DataFrame对象。
  • index:指定原始数据的列名。它成为结果行标题。
  • columns:指定原始数据的列名称。它成为结果列标题。
    计算未在参数索引和列中指定的列的平均值作为结果。此时,将排除其数据类型不是数字的列。稍后将描述计算平均值以外的值的方法。
print(pd.pivot_table(df, index='Pclass', columns='Sex'))
#               Age                   Fare             Survived          
# Sex        female       male      female       male    female      male
# Pclass                                                                 
# 1       34.611765  41.281386  106.125798  67.226127  0.968085  0.368852
# 2       28.722973  30.740707   21.970121  19.741782  0.921053  0.157407
# 3       21.750000  26.507589   16.118810  12.661633  0.500000  0.135447

pandas.pivot_table()函数返回pandas.DataFrame。

print(type(pd.pivot_table(df, index='Pclass', columns='Sex')))
# <class 'pandas.core.frame.DataFrame'>

此外,如果在参数值中指定了原始数据的列名,则仅计算该列的结果。

print(pd.pivot_table(df, index='Pclass', columns='Sex', values='Age'))
# Sex        female       male
# Pclass                      
# 1       34.611765  41.281386
# 2       28.722973  30.740707
# 3       21.750000  26.507589

也可以在参数索引,列,值中指定原始数据的列名列表。结果以多索引(分层索引)pandas.DataFrame的形式返回。

print(pd.pivot_table(df, index=['Sex', 'Pclass'], columns='Survived', values=['Age', 'Fare']))
#                      Age                   Fare            
# Survived               0          1           0           1
# Sex    Pclass                                              
# female 1       25.666667  34.939024  110.604167  105.978159
#        2       36.000000  28.080882   18.250000   22.288989
#        3       23.818182  19.329787   19.773093   12.464526
# male   1       44.581967  36.248000   62.894910   74.637320
#        2       33.369048  16.022000   19.488965   21.095100
#        3       27.255814  22.274211   12.204469   15.579696

计算每个类别的小计/总计:参数margins

如果参数margin为True,则可以计算每个类别的结果(小计)和整体结果(总计)。

print(pd.pivot_table(df, index='Sex', columns='Pclass', values='Age', margins=True))
# Pclass          1          2          3        All
# Sex                                               
# female  34.611765  28.722973  21.750000  27.915709
# male    41.281386  30.740707  26.507589  30.726645
# All     38.233441  29.877630  25.140620  29.699118

可以通过参数margins_name指定小计/总行标签/列标签。默认为“all”。

print(pd.pivot_table(df, index='Sex', columns='Pclass', values='Age',
                     margins=True, margins_name='Total'))
# Pclass          1          2          3      Total
# Sex                                               
# female  34.611765  28.722973  21.750000  27.915709
# male    41.281386  30.740707  26.507589  30.726645
# Total   38.233441  29.877630  25.140620  29.699118

指定如何计算结果值:参数aggfunc

默认情况下,将计算平均值,但是如果您为参数aggfunc指定函数,则可以通过其他方法计算该值。
默认情况下(省略参数aggfunc时),指定numpy.mean()。

print(pd.pivot_table(df, index='Sex', columns='Pclass', values='Age',
                     margins=True, aggfunc=np.min))
# Pclass     1     2     3   All
# Sex                           
# female  2.00  2.00  0.75  0.75
# male    0.92  0.67  0.42  0.42
# All     0.92  0.67  0.42  0.42

还可以在参数aggfunc中指定函数列表。

print(pd.pivot_table(df, index='Sex', columns='Pclass', values='Age',
                     margins=True, aggfunc=[np.min, np.max]))
#         amin                    amax                  
# Pclass     1     2     3   All     1     2     3   All
# Sex                                                   
# female  2.00  2.00  0.75  0.75  63.0  57.0  63.0  63.0
# male    0.92  0.67  0.42  0.42  80.0  70.0  74.0  80.0
# All     0.92  0.67  0.42  0.42  80.0  70.0  74.0  80.0

指定的函数可以是返回一维数组的标量值的函数。不限于NumPy函数,例如,Python的内置函数len()返回一维数组中的元素数是可以的。

print(pd.pivot_table(df, index='Sex', columns='Pclass', values='Age',
                     margins=True, aggfunc=len))
# Pclass      1      2      3    All
# Sex                               
# female   94.0   76.0  144.0  261.0
# male    122.0  108.0  347.0  453.0
# All     186.0  173.0  355.0  714.0

可以使用len()计算每个类别的出现次数,但是如上所述,还单独准备了一个称为crosstab()的函数。使用crosstab(),可以将结果标准化(标准化)为1。

指定是否排除原始数据的缺失值NaN:参数dropna

上面使用len()的示例的总值小于原始数据的数量。这是由于处理了缺失值NaN。

print(len(df))
# 891

print(df.isnull().sum())
# Survived      0
# Pclass        0
# Sex           0
# Age         177
# Fare          0
# Cabin       687
# Embarked      2
# dtype: int64

有关如何计算丢失的NaN的数量,请参阅以下文章。

如果参数dropna为False,则计算所有元素。

print(pd.pivot_table(df, index='Sex', columns='Pclass', values='Age',
                     margins=True, aggfunc=len, dropna=False))
# Pclass      1      2      3    All
# Sex                               
# female   94.0   76.0  144.0  314.0
# male    122.0  108.0  347.0  577.0
# All     216.0  184.0  491.0  891.0

如果将NaN处理留给pivot_table(),则可能会得到意外的结果,因此可能更安全一些,例如排除NaN或在原始数据时将其替换为另一个值。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值