这是一个关于 pandas 从基础到进阶的练习题系列,来源于 github 上的 guipsamora/pandas_exercises 。这个项目从基础到进阶,可以检验你有多么了解 pandas。
我会挑选一些题目,并且提供比原题库更多的解决方法以及更详尽的解析。
计划每天更新一期,希望各位小伙伴先自行思考,再查看答案。如果对你有帮助,记得转发推荐给你的好友!
上期文章:pandas每天一题-题目17:缺失值处理的多种方式
后台回复"数据",可以下载本题数据集
如下数据:
import pandas as pd
import numpy as np
df = pd.read_csv('chipotle.tsv',
sep='\t',
converters={'item_price': lambda x: float(x[1:-1])})
数据描述:
例如:某个单子中,客人要 1瓶可乐 和 1瓶雪碧 ,那么这个订单的 order_id 为:'xx',有2个行记录(样本),2行的item_name 都是 "Canned Soda"(苏打水,视为罐装饮料) ,quantity 都是1。
第一行的 choice_description 是 "Diet Coke"(可乐) ,第二行是 "Sprite"(雪碧)
前面章节讲解过的知识点,本文不再讲解!
需求:
下面是答案了
原题数据的缺失值情况比较简单,为此我改造一下数据。
定义一个函数,方便修改数据:
def modify(*idx):
ret = df.query("item_name in ['Salad','Izze']").copy()
ret.loc[idx,'choice_description']=np.nan
return ret
modify(430,1414)
为了方便查看效果,我们只看2个品类 ['Salad','Izze']
现在我们希望使用同组 item_name 对应的值填充其缺失值。
dfx = modify(430, 1414)
dfx['choice_description'] =(
dfx.groupby('item_name')['choice_description']
.fillna(method='ffill')
)
dfx
有没有办法把 Salad 的缺失值填上?
dfx = modify(430, 1414)
dfx['choice_description'] =(
dfx.sort_values(['item_name','choice_description'])
.groupby('item_name')['choice_description']
.fillna(method='ffill')
)
dfx
看看 lzze 这个品类的细分描述有多少:
dfx = modify(1, 1414)
(
dfx.groupby('item_name')['choice_description']
.value_counts()
.to_frame()
)
这里可以发现,其实大部分的表(DataFrame)或列(Series)的操作都能用于分组操作
现在希望使用组内出现频率最高的值来填充组内的缺失值:
dfx = modify(1, 1414)
def each_gp(x):
v = x.value_counts().index[0]
return x.fillna(v)
dfx['choice_description'] =(
dfx.groupby('item_name')['choice_description']
.apply(each_gp)
)
dfx
推荐阅读: