Pandas创建显示行绝对最大值的列,但保留负值



我有一个像这样的df:

a      b      c
124    -3.09  -0.38   2.34
2359    4.81   0.51  -1.53
56555  -4.34  -0.64   2.31
96786  -3.33  -3.34  -7.62

我想计算新列中每一行的绝对最大值,该列将负值保留为负值。我得到的最接近的是以下内容:

df['new_column'] = df.abs().max(axis = 1)
new_column
3.09
4.81
4.34
7.62

但是我需要新列来保留负号-即。看起来像这样:

new_column
-3.09
4.81
-4.34
-7.62

我使用abs().idxmax()尝试了一些事情,我想知道我是否需要找到绝对最大值的位置,然后在新列中返回该位置的值-只是不确定如何做到这一点。想法吗?

这是一种使用两步的方法:首先,找到绝对最大值。然后使用eq查看绝对最大值是否等于DataFrame中的任何值,并使用输出作为-1的功率来获得符号:

row_max = df.abs().max(axis=1)
df['new_column'] = row_max * (-1) ** df.ne(row_max, axis=0).all(axis=1)

另一种选择是使用mask来选择值:

df['columns'] = df.max(axis=1).mask(lambda x: x < row_max, -row_max)

输出:

a     b     c  new_column
124   -3.09 -0.38  2.34       -3.09
2359   4.81  0.51 -1.53        4.81
56555 -4.34 -0.64  2.31       -4.34
96786 -3.33 -3.34 -7.62       -7.62

我喜欢你原来的想法,符合主题:

# setup
data = {'a': [-3.09, 4.81, -4.34, -3.33],
'b': [-.38, .51, -.64, -3.34],
'c': [2.34, -1.53, 2.31, -7.62]}
df = pd.DataFrame(data, index= [124, 2359,56555,96786])

代替:

df['new_column'] = df.abs().max(axis = 1)

让我们将其更改为返回列而不是实际值:

max_col = df.abs().idxmax(axis = 1)

从这里我们可以用enumerate作为行号来遍历它并将其设置为新列:

df['new_column'] = [df.loc[row,col] for row, col in zip(df.index, max_col)]

结果:

a     b     c  new_column
124   -3.09 -0.38  2.34       -3.09
2359   4.81  0.51 -1.53        4.81
56555 -4.34 -0.64  2.31       -4.34
96786 -3.33 -3.34 -7.62       -7.62

一年多过去了,但这个问题有一个更快的解决方案。
从您的数据集:

>>> import numpy as np
>>> import pandas as pd
>>> from io import StringIO
>>> df = pd.read_csv(StringIO("""
... ,a,b,c
... 124,-3.09,-0.38,2.34
... 2359,4.81,0.51,-1.53
... 56555,-4.34,-0.64,2.31
... 96786,-3.33,-3.34,-7.62
... """), sep=',',index_col=0)
>>> df
a       b       c
124     -3.09   -0.38    2.34
2359     4.81    0.51   -1.53
56555   -4.34   -0.64    2.31
96786   -3.33   -3.34   -7.62

我们可以这样使用argmax:

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

输出:

a       b       c   new_column
124     -3.09   -0.38    2.34        -3.09
2359     4.81    0.51   -1.53         4.81
56555   -4.34   -0.64    2.31        -4.34
96786   -3.33   -3.34   -7.62        -7.62

最新更新