Python中如何使用pandas.read_csv创建pandas.DataFrame子类的实例
解决方案
方案1:自定义类方法封装读取逻辑(最推荐)
这种方式对原有代码侵入性最低,也完全符合面向对象的封装规范,不需要修改任何初始化参数逻辑:
import pandas as pd class my_class(pd.DataFrame): def __init__(self, *args, **kwargs): # 自定义初始化逻辑保留即可 super().__init__(*args, **kwargs) def my_func(self): print('New function!') # 新增类方法封装csv读取逻辑 @classmethod def read_csv(cls, *args, **kwargs): raw_df = pd.read_csv(*args, **kwargs) return cls(raw_df)
使用时直接调用自定义类的read_csv方法即可得到自定义类实例:my_df = my_class.read_csv("你的文件路径.csv")
调用my_df.my_func()可正常执行自定义方法。
方案2:覆盖_constructor属性适配全场景
如果需要让切片、过滤等所有pandas原生操作返回的结果都是自定义类实例,可以覆盖pandas内置的_constructor属性:
import pandas as pd class my_class(pd.DataFrame): # 覆盖构造器属性,pandas所有返回新对象的操作都会调用该构造器 _constructor = lambda self, *args, **kwargs: my_class(*args, **kwargs) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def my_func(self): print('New function!')
这种场景下哪怕你先得到普通DataFrame,再用my_df = my_class(普通df)转换,后续所有操作返回的也都是自定义类实例。
data参数不可用的场景处理
如果你的自定义类特殊逻辑导致不能直接传入read_csv返回的DataFrame作为data参数,可以在类方法内拆分读取结果的核心属性传入构造器,不需要依赖data参数直接接收DataFrame对象:
@classmethod def read_csv(cls, *args, **kwargs): raw_df = pd.read_csv(*args, **kwargs) # 单独提取核心属性传入,不需要直接把raw_df作为data参数传入 return cls( data = raw_df.values, index = raw_df.index, columns = raw_df.columns )
如果自定义类完全不需要用data参数初始化,也可以在类方法内先初始化空的自定义实例,再手动给实例的内部_data、index、columns等属性赋值,只要保证赋值格式符合pandas内部规范即可。
额外说明:不建议直接修改
__class__属性的核心原因是该操作会跳过自定义类的__init__执行流程,如果你在初始化方法中定义了自定义属性,该方式会导致属性缺失引发未知错误。
内容的提问来源于stack exchange,提问作者arax
相关产品推荐
相关产品推荐

