pandas Task 04

写在前面
本文内容来源于Datawhale组队学习教程

第4章 变形

import numpy as np
import pandas as pd
df = pd.read_csv('data/table.csv')
df.head()

在这里插入图片描述
一、透视表

  1. pivot
    一般状态下,数据在DataFrame会以压缩(stacked)状态存放,例如上面的Gender,两个类别被叠在一列中,pivot函数可将某一列作为新的cols
    在这里插入图片描述
    然而pivot函数具有很强的局限性,除了功能上较少之外,还不允许values中出现重复的行列索引对(pair),例如下面的语句就会报错:
#df.pivot(index='School',columns='Gender',values='Height').head()

因此,更多的时候会选择使用强大的pivot_table函数
2. pivot_table
首先,再现上面的操作:
在这里插入图片描述
pandas中提供了各种选项,下面介绍常用参数:
① aggfunc:对组内进行聚合统计,可传入各类函数,默认为’mean’
② margins:汇总边际状态
③ 行、列、值都可以为多级

  1. crosstab(交叉表)
    交叉表是一种特殊的透视表,典型的用途如分组统计,如现在想要统计关于街道和性别分组的频数:
    交叉表的功能也很强大(但目前还不支持多级分组),下面说明一些重要参数:
    ① values和aggfunc:分组对某些数据进行聚合操作,这两个参数必须成对出现
    ② 除了边际参数margins外,还引入了normalize参数,可选’all’,‘index’,'columns’参数值

二、其他变形方法

  1. melt
    melt函数可以认为是pivot函数的逆操作,将unstacked状态的数据,压缩成stacked,使“宽”的DataFrame变“窄”

【问题一】 上面提到了许多变形函数,如melt/crosstab/pivot/pivot_table/stack/unstack函数,请总结它们各自的使用特点。

pivot:将属性A设置为索引,将属性B的值域作为新的列,将属性C作为取值,要求对任意索引和列的组合,最多只能有一个属性C的值
pivot_table:相对于privot,前面的操作一样,不过专门用于对任意索引和列的组合,可能有多个属性C的值的情况:aggfunc为统计函数参数,默认取平均值(并且行列都可以为多级)
crosstab:将属性A作为索引,将属性B的值域做为新的列,然后进行统计:values参数为用于统计的值,默认为1;aggfunc为统计函数参数,默认为count(不支持多级分组)
melt:pivot的逆操作——将value作为新的列,将原来的列合并为一个新的属性作为列
stack:将值域合并为属性,然后将属性划分到行,或者列
unstack:stack的逆操作——将行或列的属性的值域做为新的列

【问题二】 变形函数和多级索引是什么关系?哪些变形函数会使得索引维数变化?具体如何变化?
【问题三】 请举出一个除了上文提过的关于哑变量方法的例子。

df['count']=1
df_s = pd.pivot_table(df,index=['Class','ID'],columns='Gender',values=['count'])
df_s.stack(0).unstack(0).replace(np.nan,0).head()

【问题四】 使用完stack后立即使用unstack一定能保证变化结果与原始表完全一致吗?
【问题五】 透视表中涉及了三个函数,请分别使用它们完成相同的目标(任务自定)并比较哪个速度最快。

df = pd.read_csv('data/table.csv')
%timeit df.pivot(index='ID',columns='Gender',values='Height')
%timeit pd.pivot_table(df,index='ID',columns='Gender',values='Height')
%timeit pd.crosstab(index=df['ID'],columns=df['Gender'],values=df['Height'],aggfunc='max')

【问题六】 既然melt起到了stack的功能,为什么再设计stack函数?
stack不仅可以将合并后的新属性作为列,还可以作为行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值