python - 继承方法的功能如何像没用过一样重用呢?
问题描述
运行“新对象。数据比较”功能后,我想用一个新列表进行过滤。并给 data_comparison 一个新列表 method.new_object.data 采用我最后过滤的列表的值。但是我怎样才能像以前没有使用过 data_comparison 一样重用它呢?非常非常非常感谢。
import pandas as pd
import os
csv_path = os.path.expanduser("~/Desktop/dataset/traffic-crashes-vehicles-1.csv")
data = pd.read_csv(csv_path)
class MainData:
def __init__(self, filter_items=None):
self.data = data
self.filter_items = filter_items
def column_filter(self):
self.data = self.data[self.filter_items]
return self.data
def data_clean(self):
self.data = self.data.dropna()
return self.data
def data_comparison(self,item_compare_lists):
item_compare_list = item_compare_lists
for i in item_compare_list:
if i == 'less than and equal to':
self.data = self.data[self.data[item_compare_list[i]['item']].le(item_compare_list[i]['value'])]
elif i == 'less than and not equal to value':
self.data = self.data[self.data[item_compare_list[i]['item']].lt(item_compare_list[i]['value'])]
elif i == 'the greater and not equal':
self.data = self.data[self.data[item_compare_list[i]['item']].gt(item_compare_list[i]['value'])]
elif i == 'greater and equal':
self.data = self.data[self.data[item_compare_list[i]['item']].ge(item_compare_list[i]['value'])]
elif i == 'equal to':
self.data = self.data[self.data[item_compare_list[i]['item']].eq(item_compare_list[i]['value'])]
elif i == 'not equal':
self.data = self.data[self.data[item_compare_list[i]['item']].ne(item_compare_list[i]['value'])]
else:
print('eşit değil')
return self.data
new_object = MainData(filter_items=['MAKE', 'NUM_PASSENGERS', 'VEHICLE_YEAR'])
new_object.column_filter()
#new_object.column_filter() 输出
MAKE NUM_PASSENGERS VEHICLE_YEAR
6 CHEVROLET NaN 2017.0
7 NISSAN NaN 2017.0
18 HYUNDAI 1.0 2017.0
24 DODGE NaN 2017.0
47 CHEVROLET NaN 2017.0
#在过滤列中的日期数据之后。第一个过滤器
item_compare_list = {
'less than and not equal to value': {'item': 'VEHICLE_YEAR', 'value': 2018},
'the greater and not equal': {'item': 'VEHICLE_YEAR', 'value': 2016},
}
new_object.data_comparison(item_compare_lists=item_compare_list)
print(new_object.data)
#我有问题的部分。第二个过滤器列表
item_compare = {
'less than and not equal to value': {'item': 'VEHICLE_YEAR', 'value': 2019},
'the greater and not equal': {'item': 'VEHICLE_YEAR', 'value': 2017},
}
new_object.data_comparison(item_compare_lists=item_compare)
print(new_object.data)
我在第二个过滤器和输出后遇到的问题
Empty DataFrame
Columns: [MAKE, NUM_PASSENGERS, VEHICLE_YEAR]
Index: []
我知道问题的原因 在第一个 data_comparison 函数运行时更改了数据。当我想第二次使用它时,数据不是以原始形式而是以过滤后的形式返回到“data_comparison”。我想要的是,每次我再次使用 data_comparison 方法时,都会保留第一个数据,而不是 data_comparison 数据。
解决方案
您的问题是基于这样一个事实,即该方法不是纯函数。(您可能想熟悉这个概念。)相反,它是不纯的,即它改变了对象的状态。
为了使其纯粹,不要让它对对象应用更改,而是让它简单地返回值。如何处理面向对象编程中的方法有不同的风格: 一些设计更喜欢对象是完全不可变的;其他设计允许对象的突变。但总的来说,在一种方法中操作对象和返回值都是一个坏主意。
因此,在data_comparison
方法中,您可以在方法的开头编写:
data = self.data
然后在该方法中替换self.data
by的所有以下用法data
。这将保持self.data
不变,因此不会改变对象的状态。(请记住,每个方法中的第一个参数self
, 是指对象。因此更改 的属性data
就是self
更改对象。)
您的代码中还有其他缺陷,但由于这不是代码审查,我将限制自己回答您的具体问题。
推荐阅读
- c# - 如何通过 c# 代码为 Kentico 12 中的新子域生成新许可证
- python-datetime - 气流调度程序在其开始日期之前执行 dag
- reactjs - 如何在另一个组件的已绑定 onClick 事件中使用更新后的变量?
- python - 获取类型错误:'int' 对象在 Python 3 中不可下标
- node.js - Socket.io 访问控制允许来源通配符
- javascript - 在 django 中显示图像
- laravel - 如何在laravel中使用数组保存多个数据
- linux - 如果我导入“C”,则无法交叉编译
- javascript - 使用矩阵查找最短路径遍历
- javascript - 如何检查整个对象的数组(或至少 2 个键值对)[在 reactjs 中]?