前面我们一直在讲解 pandas 数据处理的各种知识点,现在开始就应用上这些知识点来探索一下点餐数据。
本系列计划每天更新一期,希望各位小伙伴先自行思考,再查看答案。如果对你有帮助,记得转发推荐给你的好友!
上期文章:pandas每天一题-题目19:"炸列"操作的多种方式
后台回复"数据",可以下载本题数据集
如下数据:
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行记录:
前面章节讲解过的知识点,本文不再讲解!
需求:
现在你为了提升销量,打算推出套餐优惠,希望把某些单品组合起来包装成套餐销售。
请你通过以上数据找出哪些品类组合最受欢迎?
下面是答案了
如果只是分析一个品类是最简单的:
df.item_name.value_counts().head(8).to_frame('count')
不妨做个柱状图更清晰:
df.item_name.value_counts().head(8).plot.bar()
横向条形图更适合:
df.item_name.value_counts().head(8).plot.barh()
点评:
前2名都是鸡肉相关,薯条排第3。挺符合美国人口味
我不确定数据是否来自美国的餐馆
单个品类的分析太普通,以至于随便用个 Excel 都能得到分析结果。
而且我们需要分析的是哪些品类经常被人们一起点餐。例如薯条配汽水等。
思路是,先要得到每个订单的品类的所有组合。例如拿开篇举例的订单:
需要得到4个品类去重后(Canned Soft Drink有重复)的3个品类的所有两两组合:
from itertools import combinations
items = [
'Steak Soft Tacos', 'Barbacoa Soft Tacos', 'Canned Soft Drink',
'Canned Soft Drink'
]
list(combinations(set(items), 2))
输出:
[('Barbacoa Soft Tacos', 'Canned Soft Drink'),
('Barbacoa Soft Tacos', 'Steak Soft Tacos'),
('Canned Soft Drink', 'Steak Soft Tacos')]
现在我们对每一组的 order_id 做这个组合:
(
df.groupby('order_id')['item_name']
.apply(
lambda x: list(combinations(set(x), 2))
)
)
现在一个订单一行,每一行的值是一个列表对象,列表里面放着订单里面所有品类的两两组合。
我们希望每个组合占一行,因为这样子方便后续统计数量。很简单,使用之前讲解过的"炸列"操作:
(
df.groupby('order_id')['item_name']
.apply(
lambda x: list(combinations(set(x), 2))
)
.explode()
)
有些订单只有一个品类,不存在两两组合,因此结果为 nan
现在仍然使用之前的套路即可得到结果:
(
df.groupby('order_id')['item_name']
.apply(
lambda x: list(combinations(set(x), 2))
)
.explode()
.value_counts().head(8)
.plot.barh()
)
点评:
只有两两组合可能不够,稍微修改参数即可得到3个品类组合的结果:
(
df.groupby('order_id')['item_name']
.apply(
lambda x: list(combinations(set(x), 3))
)
.explode()
.value_counts().head(8)
.plot.barh()
)
得到的结果就更加合理了,这里不贴结果图了
这份数据还有更多有趣的探索,下一节继续,记得点赞三连!!!!
推荐阅读: