三列向量化运算
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)
}
)
然后,我使用 min 和 max 函数创建另外两个列:
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
这样做的好处是,在您描述的情况下(即您想要聚合整行),您不需要指定要聚合的列的名称。如果您开始使用聚合添加一列,您需要确保您没有在以下聚合中包含新列 - 因此您需要指定要聚合的列。
首先,让我们创建随机数据帧:
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)
}
)
然后,我使用 min 和 max 函数创建另外两个列:
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
这样做的好处是,在您描述的情况下(即您想要聚合整行),您不需要指定要聚合的列的名称。如果您开始使用聚合添加一列,您需要确保您没有在以下聚合中包含新列 - 因此您需要指定要聚合的列。