如何使用元组对pandas DataFrame列按分组规则实现多范围条件过滤
实现逻辑
首先将原分组规则的键值对反转,得到「分组名-年龄区间」的映射表,再判断每行数据的age是否落在对应分组的闭区间内即可,两种常用实现方式如下:
小数据量快速实现(代码简洁)
import pandas as pd # 原始数据 data = [['A',23], ['D',50], ['C',32], ['D',21], ['D',24], ['B',20], ['C',68], ['A',52], ['A',41],[ 'D',44], ['B',29], ['B',70], ['B',33], ['C',56], ['A',72]] df = pd.DataFrame(data, columns = ['group', 'age']) group_mask = {(20, 30): 'A', (25, 30): 'B', (65, 70): 'C', (40, 50): 'D'} # 反转得到分组到区间的映射 group_to_range = {group: age_range for age_range, group in group_mask.items()} # 逐行过滤 filtered_df = df[df.apply( lambda row: group_to_range[row['group']][0] <= row['age'] <= group_to_range[row['group']][1], axis=1 )]
运行后得到的过滤结果如下:
| 序号 | group | age |
|---|---|---|
| 0 | A | 23 |
| 1 | D | 50 |
| 6 | C | 68 |
| 9 | D | 44 |
| 10 | B | 29 |
大数据量高性能实现(向量化操作)
如果数据量超过10万行,建议用下面的向量化方案,性能比逐行apply高10倍以上:
# 将区间规则转为DataFrame range_rule = pd.DataFrame([ (group, low, high) for (low, high), group in group_mask.items() ], columns=['group', 'age_low', 'age_high']) # 关联规则后过滤 df = df.merge(range_rule, on='group', how='left') filtered_df = df[(df['age'] >= df['age_low']) & (df['age'] <= df['age_high'])][['group', 'age']]
内容的提问来源于stack exchange,提问作者Diop Chopra
相关产品推荐
相关产品推荐

