解决方法
方法一:把 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/