Python 如何仅使用返回多个值的函数的一个特定输出操作列条目?

Python 如何仅使用返回多个值的函数的一个特定输出操作列条目?,python,pandas,dataframe,apply,Python,Pandas,Dataframe,Apply,我有这样一个数据帧: import numpy as np import pandas as pd df = pd.DataFrame({'a': range(4), 'b': range(2, 6)}) a b 0 0 2 1 1 3 2 2 4 3 3 5 我有一个函数,它返回几个值。这里我只使用一个伪函数,它返回某个输入变量的最小值和最大值: def return_min_max(x): return (np.min(x), np.max(x)) 现

我有这样一个数据帧:

import numpy as np
import pandas as pd

df = pd.DataFrame({'a': range(4), 'b': range(2, 6)})

   a  b
0  0  2
1  1  3
2  2  4
3  3  5
我有一个函数,它返回几个值。这里我只使用一个伪函数,它返回某个输入变量的最小值和最大值:

def return_min_max(x):
    return (np.min(x), np.max(x))
现在,我想将每列的最大值与相应列中的每个值相加

所以

给予

然后

df.add(df.apply(return_min_max).apply(lambda x: x[1]))
产生期望的结果

   a   b
0  3   7
1  4   8
2  5   9
3  6  10
我想知道是否有一种更直接的方法可以避免双链的
应用

为了确保:

我对一份工作不感兴趣

df.add(df.max())

键入解决方案。我突出显示了
dummy_函数
,以说明这不是我的实际函数,而是一个具有多个输出的最小示例函数。

DataFrame.max
将返回一系列列最大值
DataFrame.add()
随后将添加此
系列
,并在列上对齐

df.add(df.max())

#   a   b
#0  3   7
#1  4   8
#2  5   9
#3  6  10

如果你认为实函数要复杂得多,那么有几种选择

保持原样,使用
.str
访问max元素

def return_min_max(x):
    return (np.min(x), np.max(x))

df.add(df.apply(return_min_max).str[1])
考虑返回一个系列,其中索引描述返回的内容:

def return_min_max(x):
    return pd.Series([np.min(x), np.max(x)], index=['min', 'max'])

df.add(df.apply(return_min_max).loc['max'])
或者,如果返回可以分开(在这种情况下,
max
min
确实不需要在同一个函数中完成),那么将它们分开就更简单了:

def return_max(x):
    return np.max(x)

df.add(df.apply(return_max))

再看一眼,您的
return\u min\u max
是一个列函数。所以情况并没有那么糟。您可以这样做,例如:

# create a dataframe for easy access
ret_df = pd.DataFrame(df.apply(return_min_max).to_dict())
#    a  b
# 0  0  2
# 1  3  5

# add 
df.add(ret_df.loc[1], axis=1)
输出:

   a   b
0  3   7
1  4   8
2  5   9
3  6  10
和numpy广播:

df.values[None,:] + ret_df.values[:,None]
给出:

array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 3,  7],
        [ 4,  8],
        [ 5,  9],
        [ 6, 10]]], dtype=int64)

第一个问题是dummy
return\u min\u max
函数。正如您所提到的,您不希望应用
,但是如果没有更多的细节,几乎不可能知道如何对该函数进行矢量化。第二部分是简单的numpy广播。如果我可以问的话,你为什么要编写返回多个值的函数?@QuangHoang:函数是固定的,我无法更改它,所以向量化无法工作。你会如何在这里使用numpy广播?@Erfan:不是我的功能,但我得拿我得到的;)
.str[1]
解决方案看起来不错。谢谢其他解决方案不起作用,因为函数确实要复杂得多。
df.values[None,:] + ret_df.values[:,None]
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 3,  7],
        [ 4,  8],
        [ 5,  9],
        [ 6, 10]]], dtype=int64)