前面我们一直在讲解 pandas 数据处理的各种知识点,现在开始就应用上这些知识点来探索一下点餐数据。
本系列计划每天更新一期,希望各位小伙伴先自行思考,再查看答案。如果对你有帮助,记得转发推荐给你的好友!
上期文章:pandas每天一题-探索分析:找出哪些菜式做成套餐能大卖
后台回复"数据",可以下载本题数据集
如下数据:
import pandas as pd
import numpy as np
from itertools import combinations
df = pd.read_csv('chipotle.tsv',
sep='\t',
converters={'item_price': lambda x: float(x[1:-1])})
df
数据描述:
例如, 某个单子中,客人点餐
于是产生了4行记录:
前面章节讲解过的知识点,本文不再讲解!
需求:
有一次你巡店,无意间看到某客人喝完了一瓶可乐,意犹未尽,再下单点了一瓶。
由此你突发奇想,有哪些品类最常被二次点餐?
说不定能搞一个"二次点餐优惠包",能进一步提升销量
下面是答案了
在同一个订单中,重复出现的品类,被视为二次点餐。
就算不看数据,凭感觉应该能想到饮料应该是最常见的二次点餐商品:
def each(xdf):
return (xdf['choice_description']=='[Coke]').sum()>1
df.groupby('order_id').filter(each)
你可能觉得是不是这桌是2个人,并且都点了可乐?
如果是这样子,那么应该只有一笔可乐记录,quantity(数量)为2:
def each(xdf):
return (xdf.eval("choice_description=='[Coke]' and quantity>1")).any()
df.groupby('order_id').filter(each)
下一节我们将探索就餐人数的问题,这里不展开
由于 choice_description
字段有缺失,并且需要很多数据清洗操作才能合理使用。
由此本节我们只对 item_name 做分析。
结合 item_name 与 choice_description 字段做分析更合理
按需求,我们需要每个订单为一组,统计里面的品类频数:
df.groupby('order_id')['item_name'].value_counts()
此时我们需要把数量大于1的筛选出来:
ret = df.groupby('order_id')['item_name'].value_counts()
ret[ret>1].to_frame('counts')
也可以这么做:
(
df.groupby('order_id')['item_name'].value_counts()
.to_frame('counts')
.query('counts>1')
)
此时数据的一行表达的是,某品类在某订单中出现二次点餐。
我们只需要进一步对 item_name 再一次统计频数,即可知道哪些品类二次点餐最多:
(
df.groupby('order_id')['item_name'].value_counts()
.to_frame('counts')
.query('counts>1')
.index.get_level_values('item_name')
.value_counts()
)
你可能觉得我太历害了,竟然知道这种方法名字。
实际上我是记不住这么多方法名字,我只记忆关键词,比如这里是多层索引的层级——level。使用我的小工具:
利用上一节的知识,做一个简单的条形图:
(
df.groupby('order_id')['item_name'].value_counts()
.to_frame('counts')
.query('counts>1')
.index.get_level_values('item_name')
.value_counts()
.head(5).sort_values()
.plot.barh()
)
这个结果其实很不合理,原因在于我们是用品类进行统计,很多不同的菜式都属于同一个品类。
如果我们使用具体菜式名字进行统计,会得到以下图表:
这份数据还有更多有趣的探索,下一节继续,记得点赞三连!!!!
推荐阅读: