第三章 分组-练习题

2023-11-05

第三章 练习题

import numpy as np
import pandas as pd

Ex1:汽车数据集

现有一份汽车数据集,其中Brand, Disp., HP分别代表汽车品牌、发动机蓄量、发动机输出。

df = pd.read_csv('data/car.csv')
df.head()
Brand Price Country Reliability Mileage Type Weight Disp. HP
0 Eagle Summit 4 8895 USA 4.0 33 Small 2560 97 113
1 Ford Escort 4 7402 USA 2.0 33 Small 2345 114 90
2 Ford Festiva 4 6319 Korea 4.0 37 Small 1845 81 63
3 Honda Civic 4 6635 Japan/USA 5.0 32 Small 2260 91 92
4 Mazda Protege 4 6599 Japan 5.0 32 Small 2440 113 103
  1. 先过滤出所属Country数超过2个的汽车,即若该汽车的Country在总体数据集中出现次数不超过2则剔除,再按Country分组计算价格均值、价格变异系数、该Country的汽车数量,其中变异系数的计算方法是标准差除以均值,并在结果中把变异系数重命名为CoV
  2. 按照表中位置的前三分之一、中间三分之一和后三分之一分组,统计Price的均值。
  3. 对类型Type分组,对PriceHP分别计算最大值和最小值,结果会产生多级索引,请用下划线把多级列索引合并为单层索引。
  4. 对类型Type分组,对HP进行组内的min-max归一化。
  5. 对类型Type分组,计算Disp.HP的相关系数。

第小一问:

# 第一步,过滤出所属Country数超过2个的汽车
df1 = df.groupby('Country').filter(lambda x:x.shape[0]>2) 
df1.head()
# x.shape[0]代表的是取列的值。
# 比如说shape(3,2),3代表行数,2代表列数,shape[0]代表列的值:3
Brand Price Country Reliability Mileage Type Weight Disp. HP
0 Eagle Summit 4 8895 USA 4.0 33 Small 2560 97 113
1 Ford Escort 4 7402 USA 2.0 33 Small 2345 114 90
2 Ford Festiva 4 6319 Korea 4.0 37 Small 1845 81 63
3 Honda Civic 4 6635 Japan/USA 5.0 32 Small 2260 91 92
4 Mazda Protege 4 6599 Japan 5.0 32 Small 2440 113 103
# 第二步,得到过滤结果再次按Country分组拿出Price列
# 用agg分别将需要处理的函数名放入 ,其中变异系数重命名用元祖的方式传入
df1.groupby('Country').Price.agg(['mean',('Cov',lambda x:x.std()/x.mean()),'count'])
mean Cov count
Country
Japan 13938.052632 0.387429 19
Japan/USA 10067.571429 0.240040 7
Korea 7857.333333 0.243435 3
USA 12543.269231 0.203344 26

第二小问:

# 第一种方法:
# 先看整体有多少行,按照三分之N的数量分配作为条件,再对条件分组。
df.shape[0]
60
condition = ['Head']*20+['Mid']*20+['Tail']*20
df.groupby(condition)['Price'].mean()
Head     9069.95
Mid     13356.40
Tail    15420.65
Name: Price, dtype: float64
# 第二种方法:
# 先构造一个长度与df样本数相同的condition序列,设置初始值为middle
# 用mask将前1/3替换为front,后1/3替换为back
condition = pd.Series(['middle']*df.shape[0]).mask(df.index<df.shape[0]/3,'front').mask(df.index>=2*df.shape[0]/3,'back')
df.groupby(condition)['Price'].mean()
back      15420.65
front      9069.95
middle    13356.40
Name: Price, dtype: float64

第三小问:

# 对df按Type分组后使用agg以传入字典的方式对指定列进行聚合
res = df.groupby('Type').agg({'Price':['max'],'HP':['min']})
# 用下划线把多级列索引合并为单层索引
res.columns = res.columns.map(lambda x:'_'.join(x))
res.head()
Price_max HP_min
Type
Compact 18900 95
Large 17257 150
Medium 24760 110
Small 9995 63
Sporty 13945 92

第四小问:对类型Type分组,对HP进行组内的min-max归一化。

# 先定义归一化,后面最直接调用
def normalize(s):
    s_min,s_max = s.min(),s.max()
    res = (s-s_min)/(s_max-s_min)
    return res
df.groupby('Type')['HP'].transform(normalize).head()
# 自定义变换时需要使用transform方法,被调用的自定义函数, 其传入值为数据源的序列其传入值为数据源的序列 
# 与agg的传入类型是一致的,其最后的返回结果是行列索引与数据源一致的DataFrame。
0    1.00
1    0.54
2    0.00
3    0.58
4    0.80
Name: HP, dtype: float64

第五小问:对类型Type分组,计算Disp.与HP的相关系数。

df.groupby('Type')[['Disp.','HP']].corr().head()
Disp. HP
Type
Compact Disp. 1.000000 0.586087
HP 0.586087 1.000000
Large Disp. 1.000000 -0.242765
HP -0.242765 1.000000
Medium Disp. 1.000000 0.370491
#  参考答案
df.groupby('Type')[['HP','Disp.']].apply(lambda x:np.corrcoef(x['HP'].values,x['Disp.'].values)[0,1])
Type
Compact    0.586087
Large     -0.242765
Medium     0.370491
Small      0.603916
Sporty     0.871426
Van        0.819881
dtype: float64

Ex2:实现transform函数

  • groupby对象的构造方法是my_groupby(df, group_cols)
  • 支持单列分组与多列分组
  • 支持带有标量广播的my_groupby(df)[col].transform(my_func)功能
  • pandastransform不能跨列计算,请支持此功能,即仍返回Seriescol参数为多列

无需考虑性能与异常处理,只需实现上述功能,在给出测试样例的同时与pandas中的transform对比结果是否一致

第一小问:groupby对象的构造方法是my_groupby(df, group_cols)

class my_groupby:
    def __init__(self, my_df, group_cols):
        self.my_df = my_df.copy()
        self.groups = my_df[group_cols].drop_duplicates()
        if isinstance(self.groups, pd.Series):
            self.groups = self.groups.to_frame()
        self.group_cols = self.groups.columns.tolist()
        self.groups = {i: self.groups[i].values.tolist() for i in self.groups.columns}
        self.transform_col = None
    def __getitem__(self, col):
        self.pr_col = [col] if isinstance(col, str) else list(col)
        return self
    def transform(self, my_func):
        self.num = len(self.groups[self.group_cols[0]])
        L_order, L_value = np.array([]), np.array([])
        for i in range(self.num):
            group_df = self.my_df.reset_index().copy()
            for col in self.group_cols:
                group_df = group_df[group_df[col]==self.groups[col][i]]
            group_df = group_df[self.pr_col]
            if group_df.shape[1] == 1:
                group_df = group_df.iloc[:, 0]
            group_res = my_func(group_df)
            if not isinstance(group_res, pd.Series):
                group_res = pd.Series(group_res,index=group_df.index,name=group_df.name)
            L_order = np.r_[L_order, group_res.index]
            L_value = np.r_[L_value, group_res.values]
        self.res = pd.Series(pd.Series(L_value, index=L_order).sort_index().values,index=self.my_df.reset_index().index, name=my_func.__name__)
        return self.res

my_groupby(df, 'Type')
<__main__.my_groupby at 0x277b774ab38>

第二小问:

支持单列分组

def f(s):
    res = (s-s.min())/(s.max()-s.min())
    return res
my_groupby(df, 'Type')['Price'].transform(f).head()
0    0.733592
1    0.372003
2    0.109712
3    0.186244
4    0.177525
Name: f, dtype: float64
df.groupby('Type')['Price'].transform(f).head()
0    0.733592
1    0.372003
2    0.109712
3    0.186244
4    0.177525
Name: Price, dtype: float64

多列分组:

my_groupby(df, ['Type','Country'])['Price'].transform(f).head()
0    1.000000
1    0.000000
2    0.000000
3    0.000000
4    0.196357
Name: f, dtype: float64
df.groupby(['Type','Country'])['Price'].transform(f).head()
0    1.000000
1    0.000000
2    0.000000
3    0.000000
4    0.196357
Name: Price, dtype: float64

第三小问:支持带有标量广播的my_groupby(df)[col].transform(my_func)功能

my_groupby(df, 'Type')['Price'].transform(lambda x:x.mean()).head()
0    7682.384615
1    7682.384615
2    7682.384615
3    7682.384615
4    7682.384615
Name: <lambda>, dtype: float64
df.groupby('Type')['Price'].transform(lambda x:x.mean()).head()
0    7682.384615
1    7682.384615
2    7682.384615
3    7682.384615
4    7682.384615
Name: Price, dtype: float64

第四小问:pandas的transform不能跨列计算,请支持此功能,即仍返回Series但col参数为多列

my_groupby(df, 'Type')['Disp.', 'HP'].transform(lambda x: x['Disp.']/x.HP).head()
0    0.858407
1    1.266667
2    1.285714
3    0.989130
4    1.097087
Name: <lambda>, dtype: float64
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第三章 分组-练习题 的相关文章

随机推荐

  • html左边多级菜单导航栏,精美的多级侧边栏导航菜单jQuery插件

    这是一款基于bootstrap的精美多级侧边栏导航菜单jQuery插件 该导航菜单在bootstrap样式的基础上 通过jQuery来为导航菜单绑定菜单点击事件 生成非常漂亮的多级侧边栏导航菜单 使用方法 在页面中引入bootstrap样式
  • prometheus监控k8s kube-proxy target down

    prometheus kube proxy target down 解决 修改配置 kubectl edit cm kube proxy n kube system metricsBindAddress 0 0 0 0 10249 删除 k
  • 2050年全部人口的86%集中到城市,智慧城市的五项关键技术

    本文翻译至 http readwrite jp cities 32108 人口的城市化毫不停息 人们的住所越来越多地从地方移动到城市 到2050年为止预计发达国家人口的86 发展中国家人口的64 将住在城市 数量有限的城市要负担如此多的人口
  • 查看并设置Linux的IP地址

    ip addr 查看网卡分配情况 如发现IP地址为 127 0 0 1 这里要修改ip地址 修改IP地址方法 1 进入 etc sysconfig network scripts 注 不同版本ifcfg ens33文件名可能会不一样 2 修
  • Visual C++ MFC的图形绘制——常见问题汇总

    Visual C MFC的图形绘制 常见问题汇总 目录 一 常见问题 1 菜单界面制作 2 命令响应函数 3 添加私有变量 4 消息响应函数 二 后记 三 补充代码 一 常见问题 1 菜单界面制作 题目描述 新建一个单文档类型的MFC Ap
  • 别再写满屏的 if、else 了,试试策略模式

    你还在写满屏的 if else switch 之类的判断逻辑吗 栈长在开发人员的代码中看过太多这样的低级代码了 真的太 low 极不好维护 本文栈长就教你如何用策略模式干掉 if else switch 让你的代码更优雅 什么是策略模式 比
  • 一起自律打卡社群第3期

    如果你愿意 你可以变得更好 社群大家都知道是怎么回事 建这个群组主要就是互相鼓励 一起前进 不要在生活或工作学习中处于一种颓废的状态 干啥都提不上劲 对生活也没有多大的期望 其实都是懒散惯了 导致对生活缺少一种积极的能量 从而想伪躺平当个咸
  • 电脑系统重装后触控板用不了了(消失了)

    问题 win10系统重装后发现触控板用不了 消失了 如图 正常的情况应该如图下 造成这种情况的原因 1 可能是误删触控板驱动 2 可能是重装系统的时候触控板驱动没打上 3 可能是触控板因进水 撞击损坏 4 略 可能因素太多了 这次我主讲华硕
  • express+websocket实现线上聊天

    1 webSocket简介 WebSocket是一种通信协议 可在单个TCP连接上进行全双工通信 WebSocket使得客户端和服务器之间的数据交换变得更加简单 允许服务端主动向客户端推送数据 在WebSocket API中 浏览器和服务器
  • 静态类型推导

    前面说泛型的时候 提到了C 模板的实现方式是动态特性静态化 在实际情况中 这是一个提高效率的好办法 动态性的好处是灵活 开发简便 静态性的特性是效率高 编译期检查较好 因此很自然地就有一个问题 能不能各取所长 达到两全其美 应该说 在一定程
  • Apache Tika入门

    文章目录 1 基本介绍 2 Tika使用 2 1 解析器接口 The Parser interface 2 1 1 自定义Parser类 2 2 检测器接口 2 3 Tika配置 1 基本介绍 Apache Tika 文本分析工具包 能够检
  • Python可视化——3D绘图解决方案pyecharts、matplotlib、openpyxl

    Python可视化 3D绘图解决方案pyecharts matplotlib openpyxl 1 pyecharts 2 matplotlib 3 openpyxl 这篇博客将介绍python中可视化比较棒的3D绘图包 pyecharts
  • Java Thread.Sleep()具有什么功能呢?

    转自 Java Thread Sleep 具有什么功能呢 下文笔者讲述Thread Sleep 方法的功能简介说明 如下所示 Thread Sleep 方法的功能 暂停当前线程 当线程停止后 会通知线程调度器在当前时间周期内将其状态设置为w
  • qt5中QString输出变量的值

    概述 QString类中有两种实现输出字符串中含有变量值的方式 这里做下记录 示例 方法一 使用QString的函数asprintf int m age 12 QString asprintf 年龄是 d m age 方法二 使用arg Q
  • 对数器

    记录下笔记 对数器的概念和作用 对数器主要用来测试自己写的程序是否完全正确 该方法通过大量的随机数据进行验证 有时候做算法题可能无法短时间内 或者很难推导出正确的数学式子 比如贪心算法 来验证自己算法的正确 这时候就需要大量的随机样本进行测
  • vue-quill-editor编辑器的安装与配置(包含字号大小,图片缩放)

    1 安装vue quill editor npm install vue quill editor save 2 main js全局引用 import VueQuillEditor from vue quill editor 一定要引入这三
  • jquery完成商品列表按价格升序、降序排序

    实现思路 商品列表按价格的升序 降序的实现主要思路就是获取到所有的商品节点 然后都存到数组里面 数组就按照商品价格进行冒泡排序 将数组里的商品进行降序或升序的排序 最后清空在html下原本的所有商品 然后把数组里的商品按排序后的顺序重新添加
  • mysql html,将HTML存储到MySQL数据库中

    I m trying to store a String which contains HTML in a MySQL database using Longtext data type But it always says You hav
  • 【NLP】信息检索变得简单、不同类型及其工作原理

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 第三章 分组-练习题

    第三章 练习题 import numpy as np import pandas as pd Ex1 汽车数据集 现有一份汽车数据集 其中Brand Disp HP分别代表汽车品牌 发动机蓄量 发动机输出 df pd read csv da