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

基于多条件对水果采购DataFrame去重并按列聚合

按自定义规则聚合水果采购DataFrame

给定一份按日期降序排序的水果采购DataFrame,需要按fruit字段分组去重,不同字段采用指定聚合规则,且方案需支持后续扩展更多字段,固定规则如下:

  • price:取最大值(最高售价)
  • date、place、colour:取最新的非空(非NaN)值
  • qty:取平均值

原始数据

import pandas as pd

# 构造原始DataFrame
data = {
    'fruit': ['Apple', 'Apple', 'Apple', 'Pear', 'Pear', 'Pear'],
    'date': ['25-12-2023', '22-11-2023', '20-10-2023', '19-10-2023', '18-10-2023', '17-10-2023'],
    'price': [4, 5, 6, 4, 5, 10],
    'place': [pd.NA, 'London', 'Paris', 'Sweden', 'London', 'Paris'],
    'colour': ['Green', 'Red', pd.NA, 'Red', 'Green', 'Purple'],
    'qty': [5, 6, 8, 8, 8, 9]
}
df = pd.DataFrame(data)

预期输出

fruit        date  price   place colour   qty
0  Apple  25-12-2023      6  London  Green  6.33
1   Pear  19-10-2023     10  Sweden    Red  8.33

解决方案

1. 自定义聚合函数

针对需要取最新非NaN值的字段,利用数据已按日期降序的特性,自定义函数直接取第一个非空值:

def get_latest_non_null(series):
    # 过滤空值后取第一个元素,若无有效值则返回NA
    return series.dropna().iloc[0] if not series.dropna().empty else pd.NA

2. 定义可扩展的聚合规则字典

通过字典映射字段与对应的聚合规则,后续新增字段只需在字典中添加键值对即可:

agg_rules = {
    'date': get_latest_non_null,
    'price': 'max',
    'place': get_latest_non_null,
    'colour': get_latest_non_null,
    'qty': 'mean'
}

3. 执行分组聚合

按fruit字段分组并应用聚合规则:

# 分组聚合,保留fruit作为列而非索引
result_df = df.groupby('fruit', as_index=False).agg(agg_rules)

# 可选:将qty字段保留两位小数,匹配预期格式
result_df['qty'] = result_df['qty'].round(2)

执行后得到的result_df与预期输出完全一致,规则字典的设计让扩展新字段聚合逻辑变得非常便捷。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:50:27