解决pandas apply返回多个值时报错:ValueError: too many values to unpack
·
解决方法
方法一:把 df.apply(function, axis=1)改为:zip(*df.apply(function, axis=1))
方法二:修改apply循环的那个函数,使其在传入的series中修改,并返回一个series
方法三:在apply中加一个参数result_type,改为:df.apply(add_one, axis=1, result_type='expand')
问题解析
对于下面的代码:
import pandas as pd
# 对传入的值做 +1 的操作
def add_one(series):
return series['a'] + 1, series['b'] + 1
df = pd.DataFrame([[10, 1],
[20, 2],
[30, 3], ], columns=['a', 'b'])
df['a'], df['b'] = df.apply(add_one, axis=1)
直接运行就会报错ValueError: too many values to unpack (expected 2),因为apply的返回结果是一个series,每一个series的值都包含一个tuple类型的数据,每个tuple中包含多个值,就是apply需要的结果。因此可以有以下写法:
方法一:使用zip处理tuple的常用方法:
df['a'], df['b'] = zip(*df.apply(add_one, axis=1))
方法二:修改apply的函数,使其在传入的series的基础上修改值,然后返回这个修改后的series,覆盖掉原来的值
def add_one(series):
series['a'] = series['a'] + 1
series['b'] = series['b'] + 1
return series
方法三:这个更简便一点,直接加一个参数result_type就行:
df = df.apply(add_one, axis=1, result_type='expand')
参考文章
pandas 的apply返回多列,并赋值:https://blog.csdn.net/bbbeoy/article/details/105426825
Pandas 一次 Apply 返回多列结果的方法:https://liangxinhui.tech/2019/08/02/pandas-apply-multiple-columns-as-result/
更多推荐

所有评论(0)