You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于相邻年龄区间条件的Pandas分组聚合列表实现需求

解决方案:仅聚合相邻年龄区间的分组逻辑

要实现「仅当年龄区间相邻时才进行聚合」的需求,我们可以通过给年龄区间建立索引映射,在分组内识别连续的索引块来实现。具体步骤如下:

  1. 建立年龄区间与数字索引的映射,快速判断区间是否相邻
  2. 为每条数据添加对应的年龄区间索引
  3. 自定义聚合函数,在分组内筛选出连续相邻的年龄区间组
  4. 展开聚合后的结果,得到最终的分组数据

完整代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:10:38