MST

星途 面试题库

面试题:Python中Pandas库复杂分组聚合及性能优化

有一个非常大的DataFrame,包含'日期'(精确到分钟)、'地区'、'产品类别'、'销售额'列。需求是按'地区'和'日期'(日期只保留到天)分组,统计每天每个地区每个产品类别的销售额总和,同时找出销售额总和最高的前三个地区 - 日期组合。请写出实现代码,并阐述如何对该操作进行性能优化。
29.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

代码实现

import pandas as pd

# 假设已经读取了DataFrame,命名为df
# 将日期列转换为datetime类型
df['日期'] = pd.to_datetime(df['日期'])

# 提取日期中的天
df['日期'] = df['日期'].dt.date

# 按'地区'和'日期'分组,统计每个产品类别的销售额总和
grouped_df = df.groupby(['地区', '日期', '产品类别'])['销售额'].sum().reset_index()

# 找出销售额总和最高的前三个地区 - 日期组合
top_3_groups = grouped_df.groupby(['地区', '日期'])['销售额'].sum().reset_index().nlargest(3, '销售额')[['地区', '日期']]

性能优化阐述

  1. 数据类型优化:在操作之前,确保所有列的数据类型是合适的,例如将日期列转换为datetime类型,数值列确保为数值类型,避免不必要的类型转换开销。对于类别型数据,如'地区'和'产品类别',可以使用astype('category')将其转换为类别类型,这样在内存占用和计算效率上都有提升。
  2. 减少数据量:如果原始DataFrame有很多不需要的列,可以在操作之前删除,减少内存占用和计算量。
  3. 分块处理:由于DataFrame非常大,可以考虑分块读取数据,例如在读取文件时使用chunksize参数。在分块处理时,对每一块数据进行上述的分组统计操作,最后再合并结果。
  4. 使用高效的聚合函数groupby操作时,使用内置的高效聚合函数,如sum,避免使用自定义的复杂聚合函数,因为自定义函数的计算效率相对较低。
  5. 并行计算:可以使用dask等库进行并行计算,dask能够处理比内存更大的数据,将DataFrame分块并行处理,加快整体计算速度。