基于相邻年龄区间条件的Pandas分组聚合列表实现需求
解决方案:仅聚合相邻年龄区间的分组逻辑
要实现「仅当年龄区间相邻时才进行聚合」的需求,我们可以通过给年龄区间建立索引映射,在分组内识别连续的索引块来实现。具体步骤如下:
- 建立年龄区间与数字索引的映射,快速判断区间是否相邻
- 为每条数据添加对应的年龄区间索引
- 自定义聚合函数,在分组内筛选出连续相邻的年龄区间组
- 展开聚合后的结果,得到最终的分组数据
完整代码实现
import pandas as pd # 创建示例数据 df = pd.DataFrame({ 'country': ['1', '1', '1', '1'], 'age': [5, 25, 45, 70], 'gender': ['M', 'M', 'M', 'M'], 'language': ['A', 'B', 'B', 'A'] }) # 定义年龄区间与标签 age_bins = [(0, 20), (21, 40), (41, 60), (61, 100)] age_labels = ['0-20', '21-40', '41-60', '61-100'] # 生成年龄区间列 def custom_age_group(age): for i, (start, end) in enumerate(age_bins): if age >= start and age <= end: return age_labels[i] return 'Unknown' df['age_group'] = df['age'].apply(custom_age_group) # 建立年龄标签到索引的映射,用于判断相邻关系 age_label_to_idx = {label: idx for idx, label in enumerate(age_labels)} df['age_idx'] = df['age_group'].map(age_label_to_idx) # 自定义聚合函数:将分组内的相邻年龄区间合并为列表 def aggregate_adjacent(age_indices): if not age_indices: return [] # 先对索引排序 sorted_indices = sorted(age_indices) adjacent_groups = [] current_group = [sorted_indices[0]] for idx in sorted_indices[1:]: # 判断当前索引是否与组内最后一个索引相邻(差值为1) if idx == current_group[-1] + 1: current_group.append(idx) else: # 将当前组转换为年龄标签列表 adjacent_groups.append([age_labels[i] for i in current_group]) current_group = [idx] # 处理最后一组 adjacent_groups.append([age_labels[i] for i in current_group]) return adjacent_groups # 分组聚合:按gender、country、language分组,聚合相邻年龄区间 df_out = df.groupby(['gender', 'country', 'language'])['age_idx'].agg(aggregate_adjacent).reset_index() # 将聚合后的列表展开为单独的行 df_out = df_out.explode('age_idx').rename(columns={'age_idx': 'adjacent_age_groups'}) print(df_out)
代码说明
- 索引映射:通过
age_label_to_idx将每个年龄标签对应到连续数字索引,判断相邻关系只需检查索引差值是否为1,逻辑更简洁。 - 聚合函数:
aggregate_adjacent先对分组内的索引排序,再遍历识别连续索引块,将每个连续块转换回年龄标签列表。 - 展开结果:使用
explode将分组内的多个相邻区间组展开为单独行,确保非相邻区间不会被错误聚合。
输出结果
运行代码后,输出如下:
gender country language adjacent_age_groups 0 M 1 A [0-20] 1 M 1 A [61-100] 2 M 1 B [21-40, 41-60]
可以看到,language=A的两个不相邻年龄区间被分成独立行,language=B的相邻区间则被正确聚合为一个列表。
内容的提问来源于stack exchange,提问作者Tonino Fernandez
相关产品推荐
相关产品推荐

