数据分析——从入门到精通(十五)

数据透视表

  • 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等。
  • 所进行的计算与数据跟数据透视表中的排列有关。
  • 之所以称为数据透视表,是因为可以动态地去改变它们的版面布置,以便按照不同方式分析数据,也可以重新安排行号、列标和页字段
  • 每一次改变版面布置时,数据透视表会立即按照新的布置重新计算数据。
  • 另外,如果原始数据发生更改,则可以更新数据透视表。
import numpy as np
import pandas as pd 
from pandas import Series,DataFrame
# 创建20位人员的信息,包含height,weight,sex,smoke特征
df = DataFrame({
    'height':np.random.randint(155,200,size=20),
    'size':np.random.randint(20,50,size=20),
    'weight':np.round(np.random.uniform(70,120,size=20),1),
    'sex':np.random.choice(['男','女'],size=20),
    'smoke':np.random.choice(['No','Yes'],size=20)
})
df
heightsizeweightsexsmoke
01823599.9Yes
11874972.1Yes
21924697.9Yes
31883281.4No
41592079.4Yes
519142105.4Yes
618548116.8Yes
71613385.1No
81944597.7No
917636105.2Yes
101563094.5No
1117643115.1Yes
1218447119.0Yes
131674892.2Yes
141793480.5No
151852390.0No
161752070.3Yes
1719031103.5No
181953491.6No
191562271.7No

透视表

  • 分组统计的一种方式
  • 如果分组的字段作为索引使用时,使用unstack()和stack()进行堆索引操作
"""
df.pivot_table(
    values=None,          期望显示的数据
    index=None,           行索引的字段
    columns=None,         列索引的字段
    aggfunc='mean',       聚合函数,默认是平均值
    fill_value=None,      如果遇到NAN值,要进行填充
    margins=False,        是否进行合并
    dropna=True,          默认删除NAN值
    margins_name='All',    合并名称
    observed=False,
)
"""
df.pivot_table(index=['sex'])
heightsizeweight
sex
181.37536.597.0875
177.25035.591.0500
df.pivot_table(index=['sex','smoke'])
heightsizeweight
sexsmoke
No177.00000025.33333388.400000
Yes184.00000043.200000102.300000
No178.83333334.66666788.466667
Yes175.66666736.33333393.633333
df.pivot_table(values=['height','weight'],index=['sex','smoke'])
heightweight
sexsmoke
No177.00000088.400000
Yes184.000000102.300000
No178.83333388.466667
Yes175.66666793.633333
df.pivot_table(index='sex')
heightsizeweight
sex
181.37536.597.0875
177.25035.591.0500
# 此表的数据都是默认的平均聚合
df.pivot_table(index='sex',columns='smoke')
heightsizeweight
smokeNoYesNoYesNoYes
sex
177.000000184.00000025.33333343.20000088.400000102.300000
178.833333175.66666734.66666736.33333388.46666793.633333
# 默认平均值
df.pivot_table(columns='smoke')
smokeNoYes
height178.222222179.454545
size31.55555639.454545
weight88.44444497.572727
# 总和
df.pivot_table(columns='smoke',aggfunc='sum')
smokeNoYes
height1604.01974.0
size284.0434.0
weight796.01073.3
# 最大值
df.pivot_table(columns='smoke',aggfunc='max')
smokeNoYes
height195192
sex
size4549
weight103.5119
df.pivot_table(values=['height','size','weight'],
              columns='smoke',aggfunc='max')
smokeNoYes
height195.0192.0
size45.049.0
weight103.5119.0
df.pivot_table(values=['height','size','weight'],
              columns='smoke',aggfunc=np.sum)
smokeNoYes
height1604.01974.0
size284.0434.0
weight796.01073.3
# 封装函数
def sum_(item):
    return item.sum()
df.pivot_table(values=['height','size','weight'],
              columns='smoke',aggfunc=sum_)
smokeNoYes
height1604.01974.0
size284.0434.0
weight796.01073.3
# 封装函数
def sum_(item):
    display(item)
    return item.sum()
df.pivot_table(values=['height','size','weight'],
              columns='smoke',aggfunc=sum_)
3     188
7     161
8     194
10    156
14    179
15    185
17    190
18    195
19    156
Name: height, dtype: int32



0     182
1     187
2     192
4     159
5     191
6     185
9     176
11    176
12    184
13    167
16    175
Name: height, dtype: int32



3     32
7     33
8     45
10    30
14    34
15    23
17    31
18    34
19    22
Name: size, dtype: int32



0     35
1     49
2     46
4     20
5     42
6     48
9     36
11    43
12    47
13    48
16    20
Name: size, dtype: int32



3      81.4
7      85.1
8      97.7
10     94.5
14     80.5
15     90.0
17    103.5
18     91.6
19     71.7
Name: weight, dtype: float64



0      99.9
1      72.1
2      97.9
4      79.4
5     105.4
6     116.8
9     105.2
11    115.1
12    119.0
13     92.2
16     70.3
Name: weight, dtype: float64
smokeNoYes
height1604.01974.0
size284.0434.0
weight796.01073.3
# 封装函数
def sum_(item):
    # display(item)  item是Series类型
    # height和weight计算它的平均值
    # size计算它的最小值
    return item.min() if item.name == 'size' else item.mean()
df.pivot_table(values=['height','size','weight'],
              columns='smoke',aggfunc=sum_)
smokeNoYes
height178.222222179.454545
size22.00000020.000000
weight88.44444497.572727

交叉表

  • 统计个数
"""
pd.crosstab(
    index,
    columns,
    values=None,
    rownames=None,
    colnames=None,
    aggfunc=None,
    margins=False,
    margins_name='All',
    dropna=True,
    normalize=False,
)
"""
pd.crosstab(df['sex'],df['smoke'])
smokeNoYes
sex
35
66
pd.crosstab(df['sex'],df['smoke'],margins=True)
smokeNoYesAll
sex
358
6612
All91120
pd.crosstab(df['sex'],df['smoke'],margins=True,margins_name='小计')
smokeNoYes小计
sex
358
6612
小计91120
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今晚务必早点睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值