LeetCode183题——从不订购的客户
一、题目
找出所有从不点任何东西的顾客。
以 任意顺序 返回结果表。
二、题解
1.行过滤法
官方题解(加入自己的理解)
import pandas as pd
def find_customers(customers: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame:
#行过滤法
#选择order['customerId']中'id'不存在的行(说明在订单中没有该客户)
df = customers[(~customers['id'].isin(orders['customerId']))]
#创建一个只包含name列的数据框架
#并将列name重命名为Customers
df = df[['name']].rename(columns={
'name':'Customers'})
return df
2.左连接法
思路是基于共同的客户 ID(在 customers 表中的 id 列和 orders 表中的 customerId 列),将表 customers 与表 orders 进行连接。
使用左连接(Left Join)在 customers 上,因为我们希望将所有来自 customers 的客户都包括进来,无论他们是否下过订单。因此,通过使用左连接,可以保留所有来自左表(customers)的行,并将它们与右表(orders)中基于 id 和 customerId 进行匹配的相应行分别对应。
官方题解如下
import pandas as pd
def find_customers(customers: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame:
df = customers.merge(orders, left_on='id', right_on='customerId', how='left')#how应该是连接方式
df = df[df['customerId'].isna()]
df = df[['name']].rename(columns={
'name': 'Customers'})
return df
三、自己的记录
1.在pandas中,~ 表示逻辑非,isin(values) 用于基于其值是否在给定集合 values 中来过滤和选择行。
2.merge函数是 pandas 库中的一个函数,它允许将两个 DataFrame 对象按照指定的列或索引进行合并。
3.DataFrame.isna(self)返回一个布尔值相同大小的对象,指示值是否为NA。NA值(例如None或numpy.NaN)被映射为True值,其他所有内容都映射为False值。