如何删除类方法生成的DataFrame中的重复元素并保留同商品低价条目
实现方案
你可以通过扩展自定义Item类的魔法方法、补充两层去重逻辑实现需求,完整修改后的代码如下:
import os import pandas as pd import math cwd = os.path.abspath('') files = os.listdir(cwd) df = pd.DataFrame() for file in files: if file.endswith('.XLSX') or file.endswith('.xlsx'): # 兼容小写后缀 df = pd.concat([df, pd.read_excel(file)], ignore_index=True) # 新版pandas已弃用append,改用concat df = df.where(df.notnull(), None) array = df.values.tolist() print(array) class Item(): def has_all_properties(self): return bool(self.__name and not math.isnan(self.__cost) and self.__gender and self.__prime) def clean(self): return bool(self.__name and self.__cost <=20 and self.__gender == "male" and self.__prime == "yes") def __init__(self, name, cost, gender, prime): self.__name = name self.__cost = cost self.__gender = gender self.__prime = prime def __repr__(self): return f"Item({self.__name},{self.__cost},{self.__gender},{self.__prime})" def __tuple__(self): return self.__name, self.__cost, self.__gender, self.__prime # 新增:判断两个Item实例是否全属性完全一致 def __eq__(self, other): if not isinstance(other, Item): return False return self.__tuple__() == other.__tuple__() # 新增:哈希方法,配合set去重使用 def __hash__(self): return hash(self.__tuple__()) # 新增:属性读取方法,方便后续去重逻辑调用 def get_name(self): return self.__name def get_cost(self): return self.__cost mylist = [Item(*k) for k in array] filtered = filter(Item.has_all_properties, mylist) clean = filter(Item.clean, filtered) result = list(clean) # 新增:两层去重逻辑 # 第一层:去全属性完全重复的条目,保留原有顺序 seen = set() unique_full = [] for item in result: if item not in seen: seen.add(item) unique_full.append(item) # 第二层:按名称分组,保留同名称下cost最小的条目 name_lowest_cost = {} for item in unique_full: name = item.get_name() cost = item.get_cost() if name not in name_lowest_cost or cost < name_lowest_cost[name].get_cost(): name_lowest_cost[name] = item # 得到最终去重结果 final_result = list(name_lowest_cost.values()) t_list = [obj.__tuple__() for obj in final_result] print(t_list) output = pd.DataFrame(t_list, columns =['name', 'cost', 'gender', 'prime']) print(output) output.to_excel('clean_data.xlsx', index = False, header = True)
主要改动说明
- 扩展了Item类的魔法方法,通过
__eq__和__hash__实现全属性相同的实例判断,用于完全重复条目的去重 - 补充了属性读取方法,方便在类外安全读取私有属性用于分组对比
- 新增两层去重逻辑:先清除所有属性完全一致的重复行,再按商品名称分组,每组仅保留cost值最小的条目
- 额外优化了Excel读取逻辑:兼容小写的
.xlsx后缀,替换了新版pandas已经废弃的append方法为官方推荐的concat方法
内容的提问来源于stack exchange,提问作者zhangruibo101
相关产品推荐
相关产品推荐

