如何实现类中通用过滤pandas DataFrame并更新属性的方法
问题根因
- pandas的
filter方法默认返回过滤后的新DataFrame副本,不会修改原对象,你的原写法只执行了过滤操作没有回存,自然不会生效 - 直接将实例属性
a.online作为参数传入方法时,方法内拿到的是DataFrame对象的引用,直接对参数变量赋值只会修改方法内的局部变量指向,不会修改实例本身的属性值
可行实现方案
方案1:返回过滤结果手动赋值
写法最直观,不需要修改太多原有逻辑:
import pandas as pd class Exp: def __init__(self): d = {'col1': [1, 2], 'col2': [3, 4], 'col3' : [5,6]} d2 = {'col1': [7, 8], 'col2': [9, 10], 'col3' : [11,12]} self.online = pd.DataFrame(d) self.offline = pd.DataFrame(d2) def filter_cols(self, data, cols): # 返回过滤后的结果 return data.filter(items=cols) # 调用示例 print("before") a = Exp() print(a.online) # 手动将返回值赋值给对应实例属性 a.online = a.filter_cols(a.online, cols = ['col1', 'col2']) print("after") print(a.online)
方案2:传属性名动态操作,无需手动赋值
如果你不想在调用时写赋值语句,可以直接传要操作的属性名字符串,用内置方法getattr/setattr动态操作实例属性,完全不需要写if分支:
import pandas as pd class Exp: def __init__(self): d = {'col1': [1, 2], 'col2': [3, 4], 'col3' : [5,6]} d2 = {'col1': [7, 8], 'col2': [9, 10], 'col3' : [11,12]} self.online = pd.DataFrame(d) self.offline = pd.DataFrame(d2) def filter_cols(self, attr_name, cols): # 读取对应属性的原始数据 origin_data = getattr(self, attr_name) # 过滤后回存到实例属性 setattr(self, attr_name, origin_data.filter(items=cols)) # 调用示例 print("before") a = Exp() print(a.online) # 直接传属性名字符串即可,离线数据过滤只需换成"offline" a.filter_cols("online", cols = ['col1', 'col2']) print("after") print(a.online)
内容的提问来源于stack exchange,提问作者coderxXx
相关产品推荐
相关产品推荐

