博客介绍
本博客将探讨如何使用Pandas库在Python中处理和分析数据。我们将以一个具体的SQL查询转换为Pandas代码的例子为中心,展示数据处理的两种不同方法。此次案例中,我们的目标是从客户数据中找出2021年具有正收入的客户ID。
题目背景
在给定的客户数据中,包含了客户ID、年份和收入等信息。我们的任务是从中筛选出2021年收入为正的客户。
解决方案分析
方案一
def find_customers(customers: pd.DataFrame) -> pd.DataFrame:
df = customers[(customers['revenue'] > 0) & (customers['year'] == 2021)]
return df[['customer_id']]
解释:
- 数据筛选:
- 使用布尔索引,
customers['revenue'] > 0
和customers['year'] == 2021
分别筛选出收入为正和年份为2021的记录。 - 两个条件同时满足,使用
&
运算符结合。
- 使用布尔索引,
- 返回结果:
df[['customer_id']]
确保返回的DataFrame仅包含客户ID这一列。
- 功能:
- 此方法直接在原始DataFrame上进行条件筛选,找出符合条件的客户ID。
方案二
def find_customers(customers: pd.DataFrame) -> pd.DataFrame:
# 筛选出2021年的数据
customers_2021 = customers[customers['year'] == 2021]
# 按customer_id分组,并计算每个分组的revenue总和
grouped_customers = customers_2021.groupby('customer_id')['revenue'].sum()
# 筛选出revenue总和大于0的客户
positive_revenue_customers = grouped_customers[grouped_customers > 0]
# 返回包含满足条件的customer_id的DataFrame
return pd.DataFrame({'customer_id': positive_revenue_customers.index})
解释:
- 筛选年份:
- 首先筛选出2021年的数据。
- 分组聚合:
- 通过
groupby
按照customer_id
分组,然后对每个分组的revenue
求和。
- 通过
- 筛选正收入客户:
- 对分组后的总收入进行筛选,保留总收入大于0的客户。
- 返回结果:
- 创建一个新的DataFrame,仅包含满足条件的客户ID。
- 功能:
- 此方法先对数据进行分组,然后计算每个客户在2021年的总收入,筛选出收入为正的客户。
总结
以上两种方法虽然都能达到相同的目的,但处理数据的逻辑略有不同。第一种方法适合用于直接筛选符合特定条件的记录。第二种方法在需要对数据进行更复杂的分组和聚合操作时更加合适。选择哪一种方法取决于具体的数据情况和需求。