三列向量化运算

Vectorized operation on three columns

首先,让我们创建随机数据帧:

df = pd.DataFrame(
    {
    "A": np.random.randint(0, 70, size=5),
    "B": np.random.randint(-10, 35, size=5),
    "C": np.random.randint(10, 50, size=5)
    }
)

然后,我使用 minmax 函数创建另外两个列:

df['max'] = df[['A', 'B', 'C']].max(axis=1)
df['min'] = df[['A', 'B', 'C']].min(axis=1)

输出:

    A   B   C  max  min
0  17  26  31   31   17
1  45  31  17   45   17
2  36  24  31   36   24
3  16  17  24   24   16
4  16  12  23   23   12

为 'mid' 列获取剩余值的最有效和最优雅的方法是什么,以便输出如下所示:

    A   B   C  max  min  mid
0  17  26  31   31   17   26
1  45  31  17   45   17   31
2  36  24  31   36   24   31
3  16  17  24   24   16   17
4  16  12  23   23   12   16

我正在寻找矢量化解决方案。我能够使用以下条件实现此目的:

conditions = [((df['A'] > df['B']) & (df['A'] < df['C']) | (df['A'] > df['C']) & (df['A'] < df['B'])), 
              ((df['B'] > df['A']) & (df['B'] < df['C']) | (df['B'] > df['C']) & (df['B'] < df['A'])), 
              ((df['C'] > df['A']) & (df['C'] < df['B']) | (df['C'] > df['B']) & (df['C'] < df['A']))]

choices = [df['A'], df['B'], df['C']]

df['mid'] = np.select(conditions, choices, default=0)

但是,我认为有更优雅的解决方案。

你应该使用 median 吗?

df[["A","B","C"]].median(axis=1)

顺便说一下,不是 运行 一个一个地聚合,您应该按如下方式一次性完成所有事情:

df.join(df.agg([min, max, 'median'], axis=1))

输出

    A   B   C   min   max  median
0   2  22  38   2.0  38.0    22.0
1  29  15  40  15.0  40.0    29.0
2  48  -5  17  -5.0  48.0    17.0
3  17  18  43  17.0  43.0    18.0
4  60 -10  39 -10.0  60.0    39.0

这样做的好处是,在您描述的情况下(即您想要聚合整行),您不需要指定要聚合的列的名称。如果您开始使用聚合添加一列,您需要确保您没有在以下聚合中包含新列 - 因此您需要指定要聚合的列。