如何删除由 class 方法函数生成的数据框中的重复元素?

How do I delete repeated elements in a dataframe made by a class-method function?

我有一个简单的 python 数据清理代码。此代码从 Excel 导入数据,格式如下:

    product cost   used_by prime
    name    price  gender  yes or no
    name    price  gender  yes or no
    ... and so on 

之后我将使用 class 函数得到一个 mylist,看起来像这样:

mylist =    [Item(comic,20.0,male,yes), 
             Item(paint,14.0,male,no), 
             Item(pen,5.0,female,nan), 
             Item(phone case,9.0,nan,no), 
             Item(headphone,40.0,male,yes), 
             Item(coat,nan,male,no),
             Item(comic,15.0,male,yes), 
             Item(nan,15.0,male,no)
             ... and so on]

在所有过滤和清洁之后,我将得到如下所示的结果:

result = [Item(comic,20.0,male,yes), 
          Item(underwear,15.0,male,yes), 
          Item(comic,15.0,male,yes)
          ... 
          Item(underwear,15.0,male,yes), 
          ...and so on]

这是我目前得到的代码:

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'):
        df = df.append(pd.read_excel(file), ignore_index=True)

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

mylist = [Item(*k) for k in array]

filtered = filter(Item.has_all_properties, mylist)
clean = filter(Item.clean, filtered)
result = list(clean)

t_list = [obj.__tuple__() for obj in 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)

在结果中,有两种类型的重复数据,一种像underwear,有两条完全相同的行;另一个类似于 comic,具有不同的成本值。

所以我想做的是删除与第一种情况完全相同的线之一,并保留第二种情况下具有较小成本值的线。

所以对于第二种情况,我想阅读产品以确定它们是否相同,如果它们相同,然后比较它们的成本并保留价值较小的那个。但我不确定这样做是否正确。

我知道使用 pandas 一直有效,但我想探索 class 功能并使用自定义数据框。

你能建议怎么做吗?

您可以使用 Set 而不是列表,即将 myList = [Item(*k) for k in array] 更改为 mySet = {Item(*k) for k in array}

集合不允许重复。

编辑 确保在您的 Item class 中包含 __hash____eq__ 的实现,以便集合可以知道如何确定一个项目是否有重复项。

在您的情况下,__eq__ 将类似于以下内容:

def __eq__(self, other):
  self.__name == other.__name
  self.__cost == other.__cost
  self.__gender == other.__gender
  self.__prime == other.__prime