Pandas如何使用嵌套元组对多列组合应用多重过滤规则
问题根因
- 你定义的
group_mask是集合类型,不是字典,没有对应键值映射关系,且规则的索引顺序错误,应该用(group, gender)组合作为索引键,年龄区间作为值。 map是Pandas Series的专属方法,你直接对df[['group', 'gender']]这个DataFrame调用map自然会报属性不存在的错误。
修正后可运行代码
import pandas as pd # 带gender的测试数据 data = [['A', 'male', 23], ['D','female',50], ['C','male',32], ['D','male',21], ['D','female',24], ['B','female',20], ['C','male',68], ['A','male',52], ['A','male',41],[ 'D','male',44], ['B','female',29], ['B','female',70], ['B','female',33], ['C','female',56], ['A','female',72]] df = pd.DataFrame(data, columns = ['group', 'gender', 'age']) # 修正为 (group, gender) 为键、年龄区间为值的字典结构 group_mask = { ('A', 'male'): (20, 30), ('B', 'male'): (25, 30), ('C', 'male'): (65, 70), ('D', 'male'): (40, 50), ('A', 'female'): (60, 80), ('B', 'female'): (15, 30), ('C', 'female'): (50, 60), ('D', 'female'): (30, 40) } # 将group和gender拼接为元组Series,再映射对应年龄区间 df['range'] = df[['group', 'gender']].apply(tuple, axis=1).map(group_mask) # 用between方法简化区间判断,逻辑和原来的双条件判断完全等价 df['in_range'] = df['age'].between(df['range'].str[0], df['range'].str[1]) # 过滤结果并删除临时列 df = df[df['in_range']].drop(columns=['range', 'in_range']).reset_index(drop=True) print(df)
运行输出结果
group gender age 0 A male 23 1 C male 68 2 D male 44 3 B female 20 4 B female 29 5 C female 56 6 A female 72
内容的提问来源于stack exchange,提问作者Diop Chopra
相关产品推荐
相关产品推荐

