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

如何删除类方法生成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:18:02