这是一个关于 pandas 从基础到进阶的练习题系列,来源于 github 上的 guipsamora/pandas_exercises 。这个项目从基础到进阶,可以检验你有多么了解 pandas。
我会挑选一些题目,并且提供比原题库更多的解决方法以及更详尽的解析。
计划每天更新一期,希望各位小伙伴先自行思考,再查看答案。如果对你有帮助,记得转发推荐给你的好友!
后台回复"数据",可以下载本题数据集
如下数据:
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])})
数据描述:
前面章节讲解过的知识点,本文不再讲解!
需求:修改 item_name 是 lzze 的价格(item_price)为 3.5
下面是答案了
局部修改值,是 pandas 目前最不直观的操作。
初学者最常见的错误做法:
1df.query('item_name=="Izze"')['item_price']=3.5
可以看出来,pandas 给出警告!并且原表(df) 并没有修改值
问题在于 query 方法查询出来的是一个临时表,上面的代码修改的是这个临时表,因此原表(df) 没有被修改
前面的章节我们讲解过筛选数据的本质是通过行索引选取:
1idx = df.query('item_name=="Izze"').index
2df.loc[idx]
此时,修改值就很容易:
1idx = df.query('item_name=="Izze"').index
2df.loc[idx,'item_price'] = 3.5
3df
方式1略显繁琐,类似于筛选数据,我们不需要总是通过行索引操作,使用 bool 列同样可行:
1cond = df['item_name']=='Izze'
2df.loc[cond,'item_price'] = 3.5
3df
重要的是等号左边只通过一次 loc 完成定位!
点评:
这就是为什么 query 和 eval 方法这么方便,我仍然推荐大家学习 bool 列和行索引操作的原因。它为筛选、计算、赋值带来操作上的一致性
推荐阅读: