如何使Report类实例化后成为DataFrame对象?代码调试求助
解决方案
要实现实例化后直接成为包含筛选后数据的DataFrame,我们可以让Report类继承自pandas.DataFrame,把数据读取和筛选的逻辑整合到初始化流程中,或者保留load方法但让它修改实例本身而非返回新的DataFrame。下面是两种可行的实现方式:
方式一:实例化时自动完成加载(推荐)
这种方式下,创建Report对象的同时就会完成文件读取和数据筛选,直接得到目标DataFrame,无需额外调用load方法:
import pandas as pd class Report(pd.DataFrame): def __init__(self, c=['red','green','blue'], y=[2015,2016,2017,2018,2019]): # 保存颜色和年份参数为实例属性 self.color = c self.years = y # 读取并筛选数据 df = pd.read_excel(r"C:\Users\ger\Desktop\sample.xlsx", sheet_name='sht1') filtered_df = df.loc[(df['color'].isin(self.color) & df['year'].isin(self.years)), :] # 调用父类DataFrame的构造函数,将筛选后的数据传入 super().__init__(filtered_df)
使用方式:
# 直接实例化就得到筛选后的DataFrame r1 = Report() # 也可以自定义颜色和年份 r2 = Report(c=['yellow'], y=[2018,2019])
方式二:保留load方法,调用后将实例转为目标DataFrame
如果你希望保留手动触发加载的逻辑,可以让load方法修改实例本身的DataFrame数据:
import pandas as pd class Report(pd.DataFrame): def __init__(self, c=['red','green','blue'], y=[2015,2016,2017,2018,2019]): # 先初始化空的DataFrame,同时保存参数 super().__init__() self.color = c self.years = y def load(self): # 读取并筛选数据 df = pd.read_excel(r"C:\Users\ger\Desktop\sample.xlsx", sheet_name='sht1') filtered_df = df.loc[(df['color'].isin(self.color) & df['year'].isin(self.years)), :] # 将筛选后的数据替换当前实例的内容 self._update_inplace(filtered_df) return self # 可选,支持链式调用
使用方式:
r1 = Report() r1.load() # 调用后r1就变成了筛选后的DataFrame # 链式调用写法 r2 = Report(c=['yellow']).load()
为什么你的原有方式达不到预期?
你的原有代码中,Report类是一个普通的Python类,并非DataFrame的子类。load方法只是返回一个新的DataFrame对象,而Report实例本身和这个DataFrame是完全独立的——你之前的写法是把load返回的DataFrame重新赋值给变量r1,这虽然能得到目标数据,但r1已经不再是Report类的实例了。而上面的两种方式让Report本身就是DataFrame的子类,实例化后直接具备DataFrame的所有特性,同时保留了自定义的color和years属性。
内容的提问来源于stack exchange,提问作者whada
相关产品推荐
相关产品推荐

