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

如何实现类中通用过滤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:36:05