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

9jyewag0  于 2023-08-01  发布在  其他
关注(0)|答案(3)|浏览(88)

我有一个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()做了一些事情,我想知道是否需要找到绝对max值的位置,然后在新列中返回该位置的值-只是不确定该怎么做。有什么想法?

2izufjch

2izufjch1#

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

>>> 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

gijlo24d

gijlo24d2#

下面是一种使用两个步骤的方法:首先,找出绝对最大值。然后,使用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

t3psigkw

t3psigkw3#

我喜欢你最初想到的想法,保持主题:

# 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)


从那里我们可以通过枚举来迭代它,并将其设置为新列:

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

相关问题