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

如何修改Python类使其实例化时直接返回pandas DataFrame对象

问题描述

开发时遇到报错:AssertionError: DataFrame Expected type <class 'pandas.core.frame.DataFrame'>, found <class 'NoneType'> instead。
改造目标:

  • 自定义Python类调用逻辑和普通函数完全一致
  • 实例化时直接返回处理后的pandas DataFrame对象,而非默认的类实例
  • 不需要将DataFrame作为类属性访问
  • 处理逻辑与给定的正常运行函数完全等效:将class_2与class_2.5列数值求和后写入class_2列,删除class_2.5列后返回最终DataFrame。

错误最小复现代码

import pandas as pd
from pandas.testing import assert_frame_equal

class SumAllClassTwo:
    ''' class sums class_2 to class_2.5 columns then writes it to class_2'''
    
    def __init__(self, df:pd.DataFrame):
        self.df = df

    def sum_all_class_two(self):
        self.df['class_2'] = self.df['class_2'] + self.df['class_2.5'] # sum 2 and 2.5
        self.df = self.df.drop(columns=['class_2.5']) # return new 2
        return self.df
  
class TestSumAllClassTwo:

    def test_one():
        input_df = pd.DataFrame({'class_2':[1], 'class_2.5':[1]})
        result = SumAllClassTwo(input_df) # don't want df as an attribute
        expected = pd.DataFrame({'class_2':[2]})
        assert_frame_equal(result, expected)


# run test class
TestSumAllClassTwo.test_one()

预期等效的正常函数实现

def sum_all_class_two_2(df:pd.DataFrame=None):
    df['class_2'] = df['class_2'] + df['class_2.5'] # sum 2 and 2.5
    df = df.drop(columns=['class_2.5']) # return new 2
    return df


def test_sum_all_class_two_2():
    expected =  pd.DataFrame({'class_2':[2]})
    input_df = pd.DataFrame({'class_2':[1], 'class_2.5':[1]})
    result = sum_all_class_two_2(input_df)
    assert_frame_equal(expected, result)
实现方案

Python类实例化的返回值由__new__方法决定,重写该方法直接在内部完成数据处理、返回最终的DataFrame即可,不需要定义__init__方法,也不会生成类实例,完全符合需求。
改造后的类代码如下:

class SumAllClassTwo:
    '''求和class_2与class_2.5列写入class_2,删除class_2.5列后直接返回处理完成的DataFrame'''
    def __new__(cls, df: pd.DataFrame):
        # 逻辑与目标函数完全对齐
        df['class_2'] = df['class_2'] + df['class_2.5']
        processed_df = df.drop(columns=['class_2.5'])
        return processed_df

运行原有测试用例即可正常通过,调用方式SumAllClassTwo(input_df)和普通函数调用体验完全一致,返回值就是目标DataFrame,不存在类属性访问的问题。

注:如果不希望修改传入的原始DataFrame,可以在处理前先执行df = df.copy()复制一份数据再做修改,可根据自身业务需求调整。


内容的提问来源于stack exchange,提问作者user4933

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:51:22