如何删除由 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
我有一个简单的 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