如何在Pandas DataFrame中按类型聚合行并生成子值列
Pandas数据聚合实现
原始数据
| group_id | types | max_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_id | types | max_value | sub_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)
代码说明
- 先构建原始数据,提取第一行的基准类型列表和默认值
- 创建字典存储每个类型的初始值为默认值
- 从第二行开始遍历数据,对每个类型判断当前值是否更小,是则更新字典中的值
- 按照基准类型的顺序生成
sub_values列表 - 组合所有字段得到最终结果DataFrame
内容的提问来源于stack exchange,提问作者Glasnhost
相关产品推荐
相关产品推荐

