首页 > 解决方案 > python:RecursionError:调用将数据帧传递给类方法的Python对象时超出了最大递归深度

问题描述

我是 Python 新手。我正在尝试将数据框传递给一个类。我的班级有两种方法。我想将它们称为链式方法。这两种方法都返回数据帧,一种是其他方法的输入,如下面的代码返回。

import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
class Foo(pd.DataFrame):
    def __init__(self, df):
        self.df=df
    def bar(self):
        print ("Foo.bar called")
        df=self.df.rolling(window=len(df),min_periods=0).sum()
        return df
    def baz(self):
        print ("Foo.baz called")
        df=self.df.rolling(window=len(df),min_periods=0).sum()
        return df

然后执行如下

foo = Foo(df)
foo1 = foo.bar().baz()
foo2 = foo.baz().bar()
print(foo1, foo2)

使用此代码,我收到以下错误

---------------------------------------------------------------------------
RecursionError                            Traceback (most recent call last)
<ipython-input-143-090d3a6b6de4> in <module>
     11         df2=self.df2.rolling(window=len(df2),min_periods=0).sum()
     12         return df2
---> 13 foo = Foo(df)
     14 # foo.df=df
     15 # print(foo.df)

<ipython-input-143-090d3a6b6de4> in __init__(self, df2)
      2 class Foo(pd.DataFrame):
      3     def __init__(self, df2):
----> 4         self.df2=df2
      5     def bar(self):
      6         print ("Foo.bar called")

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in __setattr__(self, name, value)
   5162         else:
   5163             try:
-> 5164                 existing = getattr(self, name)
   5165                 if isinstance(existing, Index):
   5166                     object.__setattr__(self, name, value)

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in __getattr__(self, name)
   5135             return object.__getattribute__(self, name)
   5136         else:
-> 5137             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5138                 return self[name]
   5139             return object.__getattribute__(self, name)

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in __getattr__(self, name)
   5135             return object.__getattribute__(self, name)
   5136         else:
-> 5137             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5138                 return self[name]
   5139             return object.__getattribute__(self, name)

... last 2 frames repeated, from the frame below ...

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in __getattr__(self, name)
   5135             return object.__getattribute__(self, name)
   5136         else:
-> 5137             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5138                 return self[name]
   5139             return object.__getattribute__(self, name)

RecursionError: maximum recursion depth exceeded while calling a Python object

我的意图是将一种方法的输出作为输入传递给另一种方法。那就是我将一个数据框传递给我的 bar() 方法返回一个数据框,这个数据框应该作为输入传递给我的 baz() 方法。这个 baz() 方法也返回一个数据框。因此,我想将它们反复称为链。我有一个示例代码,没有使用下面的数据框。我正在尝试将类似的逻辑应用于数据帧。

class Foo1(object):
    
    def bar(self):
        print ("Foo.bar called")
        return self
    def baz(self):
        print ("Foo.baz called")
        return self
foo = Foo1()
foo2 = foo.bar().baz()
print (" id(foo):", id(foo))
print ("id(foo2):", id(foo2))
foo2 = foo.baz().bar()

我会请求任何人帮助我理解为什么它会进入无限循环。

提前致谢。

标签: pythonpython-3.xpandasdataframe

解决方案


您有多个错误:

  1. 类参数应该为空
  2. 在方法中barbaz您正在调用df而不是self.df
  3. 如果你想在方法输出上应用方法,它必须是一个Foo实例。

这是一个工作代码:

import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})

class Foo():
    def __init__(self, df):
        self.df=df
    def bar(self):
        print ("Foo.bar called")
        df=self.df.rolling(window=len(self.df),min_periods=0).sum()
        return Foo(df)
    def baz(self):
        print ("Foo.baz called")
        df=self.df.rolling(window=len(self.df),min_periods=0).sum()
        return Foo(df)

foo = Foo(df)
foo1 = foo.bar().baz()
foo2 = foo.baz().bar()
print(foo1, foo2)

推荐阅读