使用 pandas.series.apply 返回多个变量

use*_*742 1 python pandas

我想将单个函数应用于数据框列。该函数返回多个结果,我想转到原始数据框中的多个列。我似乎无法解决“太多值无法解压”错误......

df = pd.DataFrame(data={'x': [1,2,3,4]})

   x
0  1
1  2
2  3
3  4
Run Code Online (Sandbox Code Playgroud)

我想应用的功能:

def do_math(x):
    double = 2*x
    triple = 3*x
    return double, triple
Run Code Online (Sandbox Code Playgroud)

我尝试应用它(这不起作用):

df['DOUBLE'], df['TRIPLE'] = df['x'].apply(do_math)
Run Code Online (Sandbox Code Playgroud)

我想要的是 :

   x  DOUBLE  TRIPLE
0  1       2       3
1  2       4       6
2  3       6       9
3  4       8      12
Run Code Online (Sandbox Code Playgroud)

Ynj*_*jmh 5

您可以将结果转换为Series.apply列表,然后分配给多列

df[['DOUBLE', 'TRIPLE']] = df['x'].apply(do_math).tolist()
Run Code Online (Sandbox Code Playgroud)
print(df)

   x  DOUBLE  TRIPLE
0  1       2       3
1  2       4       6
2  3       6       9
3  4       8      12
Run Code Online (Sandbox Code Playgroud)

您还可以尝试DataFrame.apply使用以下行result_type='expand'

print(df)

   x  DOUBLE  TRIPLE
0  1       2       3
1  2       4       6
2  3       6       9
3  4       8      12
Run Code Online (Sandbox Code Playgroud)
print(df)

   x  DOUBLE  TRIPLE
0  1       2       3
1  2       4       6
2  3       6       9
3  4       8      12
Run Code Online (Sandbox Code Playgroud)

既然你的操作很简单,你也可以尝试一下df.eval

df[['DOUBLE', 'TRIPLE']] = df.apply(lambda row: do_math(row['x']), axis=1, result_type='expand')
Run Code Online (Sandbox Code Playgroud)
print(df)

   x  double  triple
0  1       2       3
1  2       4       6
2  3       6       9
3  4       8      12
Run Code Online (Sandbox Code Playgroud)