如何高效对多条件Pandas DataFrame进行筛选与聚合?
Pandas多条件筛选与聚合的优化实现
需求清单
- 筛选
Category为"A"或"B"的行 - 保留
Value大于10的行 - 按
SubCategory分组,计算每组Value的总和 - 按聚合后的
Value总和降序排序
测试用DataFrame
import pandas as pd data = { 'Category': ['A', 'B', 'A', 'C', 'B', 'A'], 'SubCategory': ['X', 'Y', 'X', 'Z', 'X', 'Y'], 'Value': [5, 15, 20, 25, 10, 30], 'Date': pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06']) } df = pd.DataFrame(data)
原始实现代码
filtered_df = df[(df['Category'].isin(['A', 'B'])) & (df['Value'] > 10)] grouped_df = filtered_df.groupby('SubCategory')['Value'].sum().reset_index() sorted_df = grouped_df.sort_values(by='Value', ascending=False) print(sorted_df)
优化方案:链式调用+简洁语法
你的代码逻辑完全正确,这里提供一个同时提升可读性和大型数据集处理效率的优化版本:
result = (df .query("Category in ['A', 'B'] and Value > 10") .groupby('SubCategory', as_index=False)['Value'].sum() .sort_values(by='Value', ascending=False)) print(result)
优化细节说明
可读性升级:
- 用
query()替代布尔索引,条件写法接近自然语言,多条件场景下比嵌套布尔表达式更直观 - 链式调用把所有操作串成完整逻辑链,无需多余中间变量,一眼就能理清数据处理流程
- 用
效率提升:
groupby时设置as_index=False,直接生成带列名的结果,省去额外的reset_index()步骤,减少内存操作- 链式调用不会生成中间DataFrame副本,处理超大型数据集时能节省更多内存
query()性能与布尔索引持平,但代码简洁度更高
最终输出
SubCategory Value 1 Y 45 0 X 20
内容的提问来源于stack exchange,提问作者Harold
相关产品推荐
相关产品推荐

