使用apply调用函数时报错:TypeError: 'int' object is not iterable
问题原因
你犯了个典型的pandas apply 使用误区:
- 直接调用
test_fnc(series)时,u接收的是整个Series对象,它是可迭代的,所以列表推导式能正常遍历每个元素。 - 但
series.apply(test_fnc)会把Series里的每个单个元素(比如1、2、777这种int值)逐个传给test_fnc,这时候你的lambda函数里for x in u就变成了遍历单个int,自然会报int object is not iterable的错误。
解决方案
方案1:直接用原函数处理(最省事)
既然你的函数本来就能直接处理整个Series,完全没必要用apply,直接用test_fnc(series)就行,结果已经符合预期。
方案2:修改函数适配apply
如果一定要用apply,把函数改成处理单个元素的逻辑,不要做遍历:
import pandas as pd series = pd.Series([1,2,4,777,5]) # 改成处理单个值的lambda test_fnc = lambda x: -x if x == 777 else x # 现在apply就能正常运行 result = series.apply(test_fnc) print(result)
输出:
0 1 1 2 2 4 3 -777 4 5 dtype: int64
方案3:更符合pandas风格的写法(推荐)
pandas里这种元素替换操作,用where或mask比apply效率更高(尤其是大数据量时):
import pandas as pd series = pd.Series([1,2,4,777,5]) # where:满足条件就保留原值,不满足就替换 result = series.where(series != 777, -series) # 或者用mask:满足条件就替换,不满足保留原值 # result = series.mask(series == 777, -series) print(result)
输出和上面一致。
内容的提问来源于stack exchange,提问作者Musa H. Asyali
相关产品推荐
相关产品推荐

