[每日一练]关于进店却未消费的顾客的查询

该题目来自力扣:1581. 进店却未进行过交易的顾客 - 力扣(LeetCode)

题目要求:

表:Visits

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| visit_id    | int     |
| customer_id | int     |
+-------------+---------+
visit_id 是该表中具有唯一值的列。
该表包含有关光临过购物中心的顾客的信息。

表:Transactions

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| transaction_id | int     |
| visit_id       | int     |
| amount         | int     |
+----------------+---------+
transaction_id 是该表中具有唯一值的列。
此表包含 visit_id 期间进行的交易的信息。

有一些顾客可能光顾了购物中心但没有进行交易。请你编写一个解决方案,来查找这些顾客的 ID ,以及他们只光顾不交易的次数。

返回以 任何顺序 排序的结果表。

返回结果格式如下例所示。

示例 1:

输入:
Visits
+----------+-------------+
| visit_id | customer_id |
+----------+-------------+
| 1        | 23          |
| 2        | 9           |
| 4        | 30          |
| 5        | 54          |
| 6        | 96          |
| 7        | 54          |
| 8        | 54          |
+----------+-------------+
Transactions
+----------------+----------+--------+
| transaction_id | visit_id | amount |
+----------------+----------+--------+
| 2              | 5        | 310    |
| 3              | 5        | 300    |
| 9              | 5        | 200    |
| 12             | 1        | 910    |
| 13             | 2        | 970    |
+----------------+----------+--------+
输出:
+-------------+----------------+
| customer_id | count_no_trans |
+-------------+----------------+
| 54          | 2              |
| 30          | 1              |
| 96          | 1              |
+-------------+----------------+
解释:
ID = 23 的顾客曾经逛过一次购物中心,并在 ID = 12 的访问期间进行了一笔交易。
ID = 9 的顾客曾经逛过一次购物中心,并在 ID = 13 的访问期间进行了一笔交易。
ID = 30 的顾客曾经去过购物中心,并且没有进行任何交易。
ID = 54 的顾客三度造访了购物中心。在 2 次访问中,他们没有进行任何交易,在 1 次访问中,他们进行了 3 次交易。
ID = 96 的顾客曾经去过购物中心,并且没有进行任何交易。
如我们所见,ID 为 30 和 96 的顾客一次没有进行任何交易就去了购物中心。顾客 54 也两次访问了购物中心并且没有进行任何交易。

思路流程:

首先我们要返回在Visits表和Transactions表中 出现的顾客在Transactions表中没有消费的情况(amounts=null).

  1. 第一步,将两个表按照visit_id进行连接,保留visits表中的所有内容,这时候,浏览时间列和消费数量列(transaction_id,amount),那么这些人就是没有消费过的人。
  2. 第二步:按照transaction_id返回数据为空的表(transaction_id表示消费过的顾客,不管amount列是否为空,所以这里按照transaction_id查询而不是amount)
  3. 第三步,分组完后按照customer_id进行分组并且频数求和,重置索引后重命名为count_no_trans新建一列表达为customer_id的频数统计列

代码实现:

import pandas as pd

def find_customers(visits: pd.DataFrame, transactions: pd.DataFrame) -> pd.DataFrame:
    data=pd.merge(visits,transactions,on='visit_id',how='left')
    data=data[data['amount'].isna()]
    result=data.groupby('customer_id')['customer_id'].value_counts().reset_index(name='count_no_trans')
    return result

细节注意:

有可能我们面临的数据更加庞大,这时数据录入难免会出现问题,所以我们要做好完全的准备。比如可能Transactions表可能会录入重复值,所以我们在查询空值的代码中要删除重复值。

data=data[data['amount'].isna()].drop_dupicates()

还有老生常谈的问题,在分组聚合完成后要进行索引的重置,否则会发生意想不到的问题

result=data.groupby('customer_id')['customer_id'].value_counts().reset_index(name='count_no_trans')

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值