Pandas中pd.Series.isin检测可调用却抛出‘Series对象不可调用’异常
解决Pandas Series调用
isin方法时出现'Series' object is not callable异常的问题 问题描述
我在Jupyter Notebook中运行一段处理CSV的Pandas代码时,遇到了一个非常矛盾的问题:明明通过print(type(owners.isin), callable(owners.isin))验证了isin是可调用的method,但调用owners.isin(managers)时却抛出TypeError: 'Series' object is not callable异常。更奇怪的是,这段代码在普通Python终端和IPython中都能正常运行,只有在Jupyter环境中出问题。
出错的代码片段
data = {} index_lst = [] our_lst = [] their_lst = [] for filename in glob.glob('data/tysonl.2018-05-2*.csv'): print(f"Processing {filename}") mpd = pd.read_csv(filename, usecols=['Date', 'hostname', 'primary owner', 'status']) df_date = pd.to_datetime(mpd["Date"]).dt.date[0] hostnames = mpd.hostname statuses = mpd.status owners = mpd['primary owner'] # 处理owner类型可能不是Series的情况 if type(owners) != type(pd.core.series.Series): print(f"owners should be of type pandas.core.series.Series but are actually {type(primary_owners)}. Converting") owners = pd.Series(primary_owners ) assert isinstance( owners, pd.core.series.Series), "Tried to convert owners to a Series and failed" print(type(owners.isin), callable(owners.isin)) ours = owners.isin(managers)
错误输出
Processing data/tysonl.2018-05-23-prod-quilt-status.csv <class 'method'> True --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-70-235b583cc64f> in <module>() 21 assert isinstance( owners, pd.core.series.Series), "Tried to convert owners to a Series and failed" 22 print(type(owners.isin), callable(owners.isin)) ---> 23 ours=owners.isin(managers) 24 # assert df_date not in index_lst, f"df_date {df_date} is already in the index_lst\n{index_lst}\nfilename is {filename}." 25 if dt_date not in index_lst: /usr/local/lib/python3.6/dist-packages/pandas/core/series.py in isin(self, values) 2802 """ 2803 result = algorithms.isin(_values_from_object(self), values) -> 2804 return self._constructor(result, index=self.index).__finalize__(self) 2805 2806 def between(self, left, right, inclusive=True): TypeError: 'Series' object is not callable
本地复现成功的测试代码
在普通Python终端:
jeffs@jeffs-desktop:/home/jeffs/learn_pandas (development) * $ python3 Python 3.6.5 (default, Apr 1 2018, 05:46:30) [GCC 7.3.0] on linux >>> s = pd.Series(['lama', 'cow', 'lama', 'beetle', 'lama','hippo'], name='animal') >>> s.isin(['cow']) 0 False 1 True 2 False 3 False 4 False 5 False Name: animal, dtype: bool
在IPython中:
jeffs@jeffs-desktop:/home/jeffs/learn_pandas (development) * $ ipython Python 3.6.5 (default, Apr 1 2018, 05:46:30) Type 'copyright', 'credits' or 'license' for more information IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help. In [1]: import sys In [2]: print(sys.version) 3.6.5 (default, Apr 1 2018, 05:46:30) [GCC 7.3.0] In [3]: import pandas In [4]: import pandas as pd In [5]: s = pd.Series(['lama', 'cow', 'lama', 'beetle', 'lama','hippo'], name='animal') In [6]: s.isin(['cow']) Out[6]: 0 False 1 True 2 False 3 False 4 False 5 False Name: animal, dtype: bool
问题原因与解决方法
这个矛盾问题的核心在于:你验证的owners.isin确实是可调用方法,但实际执行时,Pandas内部的self._constructor被意外覆盖成了一个Series对象,而非原本的构造函数。
可能的触发原因
- Jupyter状态残留:Jupyter会保留之前单元格的变量状态,如果之前的代码中不小心修改了
pd.Series类的_constructor属性(比如误将某个Series实例赋值给它),这个修改会一直存在于当前内核中。 - 变量名冲突:你可能在某个单元格中定义了名为
_constructor的全局变量,导致Pandas调用时混淆了对象。
具体解决步骤
- 重启Jupyter内核:这是最快的修复方式——关闭当前Notebook的内核,重新启动后再运行代码。如果问题消失,说明是之前的状态残留导致的。
- 检查并清理变量:搜索Notebook所有单元格,确认没有定义过
_constructor变量,也没有直接修改过pd.Series._constructor这类类属性。 - 临时绕过修复:如果暂时不想重启内核,可以手动构造结果来绕过出错的构造函数调用:
或者使用底层算法函数:# 直接构造结果Series ours = pd.Series(owners.isin(managers).values, index=owners.index)from pandas.core.algorithms import isin result = isin(owners.values, managers) ours = pd.Series(result, index=owners.index) - 升级Pandas版本:你使用的是较老的Pandas版本(从报错行号判断是0.23.x左右),这个版本存在一些和Jupyter交互的小bug,升级到0.25.x或更高的稳定版本也能解决问题。
额外建议
在Jupyter开发时,尽量避免直接修改类的内置属性,并且定期重启内核清理残留状态,能有效避免这类诡异问题。另外,可以添加一行检查提前排查构造函数异常:
assert callable(owners._constructor), "Series构造函数被意外覆盖!"
内容的提问来源于stack exchange,提问作者Jeff Silverman
相关产品推荐
相关产品推荐

