基于多条件对水果采购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
相关产品推荐
相关产品推荐

