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

如何在Pandas DataFrame中按类型聚合行并生成子值列

Pandas数据聚合实现

原始数据

group_idtypesmax_value
1['a','b','c','d','e']100
1['b']10
1['d']90
1['e']120

需求说明

需要按规则聚合各类型对应的max_value生成新DataFrame:

  • 以第一行的类型列表作为基准,该行的max_value为各类型的默认值
  • 后续行中,若对应类型的max_value小于默认值,则覆盖默认值;若大于则保留默认值

期望结果

group_idtypesmax_valuesub_values
1['a','b','c','d','e']100[100,10,100,90,100]

规则说明

  • 'a'、'c'无后续更小值,保留默认值100
  • 'b'后续对应值10<100,覆盖为10
  • 'd'后续对应值90<100,覆盖为90
  • 'e'后续对应值120>100,保留默认值100

实现代码

import pandas as pd

# 构建原始DataFrame
df = pd.DataFrame({
    'group_id': [1, 1, 1, 1],
    'types': [['a','b','c','d','e'], ['b'], ['d'], ['e']],
    'max_value': [100, 10, 90, 120]
})

# 提取基准配置
base_types = df.iloc[0]['types']
base_val = df.iloc[0]['max_value']

# 初始化类型-值映射
type_value_map = {t: base_val for t in base_types}

# 遍历更新映射
for _, row in df.iloc[1:].iterrows():
    current_types = row['types']
    current_val = row['max_value']
    for t in current_types:
        if current_val < type_value_map[t]:
            type_value_map[t] = current_val

# 生成sub_values列表
sub_values = [type_value_map[t] for t in base_types]

# 构建结果DataFrame
result = pd.DataFrame({
    'group_id': [df.iloc[0]['group_id']],
    'types': [base_types],
    'max_value': [base_val],
    'sub_values': [sub_values]
})

print(result)

代码说明

  1. 先构建原始数据,提取第一行的基准类型列表和默认值
  2. 创建字典存储每个类型的初始值为默认值
  3. 从第二行开始遍历数据,对每个类型判断当前值是否更小,是则更新字典中的值
  4. 按照基准类型的顺序生成sub_values列表
  5. 组合所有字段得到最终结果DataFrame

内容的提问来源于stack exchange,提问作者Glasnhost

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 21:20:13