我有一个只包含数字数据的Dataframe:

[ In1]: df = pd.DataFrame(np.random.randn(5, 3).round(2), columns=['A', 'B', 'C'])
        df

[Out1]:         A       B       C
        0   -0.27    1.22    1.10
        1   -3.22    0.48   -1.64
        2    1.42    0.24   -0.12
        3   -1.12    0.44    0.23
        4    1.88   -0.38    0.62

如何在保留符号的同时为每行 Select 绝对值的最大值?

在这种情况下,它将是:

0     1.22
1    -3.22
2     1.42
3    -1.12
4     1.88

我已经决定使用哪一列了:

[ In2]: loc_max = df.abs().idxmax(axis=1)
        loc_max

[Out2]: 
        0    B
        1    A
        2    A
        3    A
        4    A

性能很重要,因为我的实际数据帧很大.


SOLUTIONS COMPARISON:

下面的所有答案都将给出预期的结果.

稍微大一点的数据帧上的性能比较:

df = pd.DataFrame(np.random.randn(1000, 100).round(2))

def numpy_argmax():
    idx_max = np.abs(df.values).argmax(axis=1)
    val = df.values[range(len(df)), idx_max]
    return pd.Series(val, index=df.index)

def check_sign():
    row_max = df.abs().max(axis=1)
    return row_max * (-1) ** df.ne(row_max, axis=0).all(axis=1)

def loop_rows():
    return df.apply(lambda s: s[s.abs().idxmax()], axis=1)

def pandas_loc():
    s = df.abs().idxmax(axis=1)
    val = [df.loc[x, y] for x, y in zip(s.index, s)]
    return pd.Series(val, index=df.index)

%timeit numpy_argmax()
%timeit check_sign()
%timeit loop_rows()
%timeit pandas_loc()

结果:

enter image description here

和往常一样,pandas幕后的numpy级表现最好.(如果不总是这样,请告诉我.)

推荐答案

让我们对绝对值使用argmax来找出最大绝对值的指数.然后使用这些索引从每一行获得相应的值.

v = df.values
v[range(len(v)), np.abs(v).argmax(axis=1)]

array([ 1.22, -3.22,  1.42, -1.12,  1.88])

Python相关问答推荐

在Arrow上迭代的快速方法.Julia中包含3000万行和25列的表

从DataFrame.apply创建DataFrame

根据条件将新值添加到下面的行或下面新创建的行中

如何在箱形图中添加绘制线的传奇?

难以在Manim中正确定位对象

运行Python脚本时,用作命令行参数的SON文本

如何使用html从excel中提取条件格式规则列表?

如何在solve()之后获得症状上的等式的值

cv2.matchTemplate函数匹配失败

用渐近模计算含符号的矩阵乘法

启动带有参数的Python NTFS会导致文件路径混乱

如何使regex代码只适用于空的目标单元格

寻找Regex模式返回与我当前函数类似的结果

从旋转的DF查询非NaN值

Pandas—堆栈多索引头,但不包括第一列

如果包含特定值,则筛选Groupby

判断Python操作:如何从字面上得到所有decorator ?

在Python中控制列表中的数据步长

如何在PythonPandas 中对同一个浮动列进行逐行划分?

PySpark:如何最有效地读取不同列位置的多个CSV文件