首页 > 解决方案 > 如何仅使用返回多个值的函数的一个特定输出来操作列条目?

问题描述

我有一个这样的数据框:

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.apply(return_min_max)

a    (0, 3)
b    (2, 5)

进而

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

我想知道是否有一种更直接的方法可以避免两个链式apply的。

只想确认一下:

我对一个不感兴趣

df.add(df.max())

型解决方案。我强调了dummy_function以说明这不是我的实际功能,而只是用作具有多个输出的最小示例功能。

标签: pythonpandasdataframeapply

解决方案


再看一遍,你return_min_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)

推荐阅读