python - 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()
我会请求任何人帮助我理解为什么它会进入无限循环。
提前致谢。
解决方案
您有多个错误:
- 类参数应该为空
- 在方法中
bar
,baz
您正在调用df
而不是self.df
- 如果你想在方法输出上应用方法,它必须是一个
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)
推荐阅读
- c# - 将 android drawable 转换为 xamarin.forms ImageSource
- javascript - 反应中的“半控制”组件
- r - 我想使用 ggplot 在条形图中获取计数标签
- angular - Angular:如何检查表单中是否存在某些控件
- java - 使用套接字 Java 的 Android 崩溃
- windows - 使用 Microsoft Visual Studio 安装程序在 C:\\ 添加文件夹
- javascript - 无法设置未定义的属性“正在创建”
- android - 安装firebase动态链接插件后,任务':app:processDebugGoogleServices'的Ionic 3执行失败
- python - 通过 Putty 连接命令提示符的 Python Anaconda 命令提示符
- c - 我无法打印链接列表