在数据分析领域,Pandas 分组与聚合分析(groupby) 是一项至关重要的技术。它允许我们将数据集按照一个或多个列进行分组,然后对每个分组应用聚合函数,从而提取有意义的信息。举个例子,我们可能需要分析不同地区的销售额,或者不同客户群体的购买行为。如果没有 Groupby,这类分析将会变得异常繁琐。
问题场景:电商用户行为分析
假设我们有一个电商平台的订单数据,包含了用户ID、商品ID、订单金额、下单时间等信息。现在,我们需要分析每个用户的平均订单金额,找出高价值用户群体。
Groupby 底层原理:Split-Apply-Combine
Pandas Groupby 的核心思想是 Split-Apply-Combine(拆分-应用-合并)。
- Split(拆分):根据指定的列将数据分成多个组。Pandas 内部会创建一个分组器对象,记录每个分组的索引信息。
- Apply(应用):对每个分组应用聚合函数。聚合函数可以是 Pandas 内置的(如 sum、mean、count),也可以是自定义的函数。
- Combine(合并):将每个分组的结果合并成一个新的 DataFrame。
代码实现:用户平均订单金额计算
import pandas as pd
# 创建示例数据
data = {
'user_id': [1, 1, 2, 2, 3, 3, 3],
'order_amount': [100, 200, 150, 250, 80, 120, 200]
}
df = pd.DataFrame(data)
# 使用 Groupby 计算每个用户的平均订单金额
user_avg_amount = df.groupby('user_id')['order_amount'].mean()
print(user_avg_amount)
这段代码首先创建了一个包含用户ID和订单金额的 DataFrame。然后,我们使用 groupby('user_id') 将数据按照用户ID进行分组。接着,我们选择 order_amount 列,并应用 mean() 函数计算每个分组的平均值。最后,打印结果。
进阶用法:多列分组与自定义聚合函数
除了简单的单列分组,Groupby 还支持多列分组。例如,我们可以同时按照用户ID和下单月份进行分组,分析不同用户在不同月份的消费习惯。
import pandas as pd
# 创建示例数据
data = {
'user_id': [1, 1, 2, 2, 3, 3, 3],
'order_amount': [100, 200, 150, 250, 80, 120, 200],
'order_month': ['2023-01', '2023-01', '2023-02', '2023-02', '2023-03', '2023-03', '2023-03']
}
df = pd.DataFrame(data)
# 使用 Groupby 计算每个用户在每个月的平均订单金额
user_month_avg_amount = df.groupby(['user_id', 'order_month'])['order_amount'].mean()
print(user_month_avg_amount)
此外,我们还可以使用自定义的聚合函数。例如,我们可以定义一个函数来计算每个分组的订单金额的中位数。
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'user_id': [1, 1, 2, 2, 3, 3, 3],
'order_amount': [100, 200, 150, 250, 80, 120, 200]
}
df = pd.DataFrame(data)
# 定义自定义聚合函数,计算中位数
def median(series):
return np.median(series)
# 使用 Groupby 和自定义聚合函数计算每个用户的订单金额中位数
user_median_amount = df.groupby('user_id')['order_amount'].agg(median)
print(user_median_amount)
实战避坑:处理缺失值与性能优化
在使用 Groupby 进行数据分析时,需要注意以下几点:
- 处理缺失值:如果数据中存在缺失值(NaN),可能会影响聚合结果。可以使用
fillna()函数填充缺失值,或者使用dropna()函数删除包含缺失值的行。 - 性能优化:对于大型数据集,Groupby 操作可能会比较耗时。可以使用
numba库对自定义聚合函数进行 JIT 编译,提高执行效率。此外,还可以考虑使用 Dask 等分布式计算框架,将计算任务分摊到多个节点上。
Groupby 与 Nginx 访问日志分析
除了电商数据,Groupby 也常用于分析 Nginx 访问日志。例如,我们可以统计每个 IP 地址的访问次数,找出恶意攻击的 IP 地址。这在服务器安全运维中十分重要。Nginx 本身可以通过配置 limit_req 和 limit_conn 来做频率限制,防止恶意请求占用过多并发连接数,造成服务雪崩。配合宝塔面板等工具,可以更方便地管理 Nginx 配置。
import pandas as pd
# 假设 log_data 是从 nginx 日志文件中读取的数据
log_data = {
'ip_address': ['192.168.1.1', '192.168.1.1', '192.168.1.2', '192.168.1.1', '192.168.1.3', '192.168.1.2'],
'request_url': ['/index.html', '/product/123', '/index.html', '/about.html', '/contact.html', '/product/456']
}
df = pd.DataFrame(log_data)
# 统计每个 IP 地址的访问次数
ip_counts = df.groupby('ip_address')['request_url'].count()
print(ip_counts)
通过分析 Nginx 日志,我们可以进一步了解网站的访问情况,优化服务器配置,提升用户体验。 在高并发场景下,合理配置 Nginx 的反向代理和负载均衡策略至关重要。
冠军资讯
CoderPunk