前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas每天一题-题目16:条件赋值的多种方式

pandas每天一题-题目16:条件赋值的多种方式

作者头像
咋咋
发布2021-09-01 14:20:38
9430
发布2021-09-01 14:20:38
举报
文章被收录于专栏:数据大宇宙

这是一个关于 pandas 从基础到进阶的练习题系列,来源于 github 上的 guipsamora/pandas_exercises 。这个项目从基础到进阶,可以检验你有多么了解 pandas。

我会挑选一些题目,并且提供比原题库更多的解决方法以及更详尽的解析

计划每天更新一期,希望各位小伙伴先自行思考,再查看答案。如果对你有帮助,记得转发推荐给你的好友!

上期文章:pandas每天一题-题目15:删除列的多种方式

后台回复"数据",可以下载本题数据集

如下数据:

代码语言:javascript
复制
1import pandas as pd
2import numpy as np
3
4df = pd.read_csv('chipotle.tsv',
5                 sep='\t',
6                 converters={'item_price': lambda x: float(x[1:-1])})

数据描述:

  • 此数据是订单明细表。一个订单会包含很多明细项,表中每个样本(每一行)表示一个明细项
  • order_id 列存在重复
  • item_name 是明细项物品名称
  • item_price 是该明细项的总价钱

前面章节讲解过的知识点,本文不再讲解!

需求:修改 item_name 是 lzze 的价格(item_price)为 3.5

下面是答案了


方式1

局部修改值,是 pandas 目前最不直观的操作。

初学者最常见的错误做法:

代码语言:javascript
复制
1df.query('item_name=="Izze"')['item_price']=3.5

可以看出来,pandas 给出警告!并且原表(df) 并没有修改值

问题在于 query 方法查询出来的是一个临时表,上面的代码修改的是这个临时表,因此原表(df) 没有被修改

前面的章节我们讲解过筛选数据的本质是通过行索引选取:

代码语言:javascript
复制
1idx = df.query('item_name=="Izze"').index
2df.loc[idx]

此时,修改值就很容易:

代码语言:javascript
复制
1idx = df.query('item_name=="Izze"').index
2df.loc[idx,'item_price'] = 3.5
3df

方式2

方式1略显繁琐,类似于筛选数据,我们不需要总是通过行索引操作,使用 bool 列同样可行:

代码语言:javascript
复制
1cond = df['item_name']=='Izze'
2df.loc[cond,'item_price'] = 3.5
3df

重要的是等号左边只通过一次 loc 完成定位!

点评:

这就是为什么 query 和 eval 方法这么方便,我仍然推荐大家学习 bool 列和行索引操作的原因。它为筛选、计算、赋值带来操作上的一致性


推荐阅读:

  1. Python无头爬虫Selenium系列(01):像手工一样操作浏览器
  2. Python处理疫情数据(城市编码缺失补全),让你的pandas跟上你的数据思维
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方式1
  • 方式2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档