Python 从不同的列中取绝对值的最大值并过滤掉

Python 从不同的列中取绝对值的最大值并过滤掉,python,pandas,max,nan,absolute-value,Python,Pandas,Max,Nan,Absolute Value,这是我的尝试。比如说 df = pd.DataFrame({'a':[5,0,1,np.nan], 'b':[np.nan,1,4,3], 'c':[-3,-2,0,0]}) df.dropna(axis=1).max(axis=1,key=abs) 很好地过滤掉NaN值,但它得到的是0或负值,而不是绝对值中的高点 结果应该是一列带有 5 -2 4 3 您可以对平方数据使用np.nanargmax: >>> df.values[range(df.shape[0]),np.n

这是我的尝试。比如说

df = pd.DataFrame({'a':[5,0,1,np.nan], 'b':[np.nan,1,4,3], 'c':[-3,-2,0,0]})
df.dropna(axis=1).max(axis=1,key=abs)
很好地过滤掉
NaN
值,但它得到的是0或负值,而不是绝对值中的高点

结果应该是一列带有

5
-2
4
3

您可以对平方数据使用
np.nanargmax

>>> df.values[range(df.shape[0]),np.nanargmax(df**2,axis=1)]
array([ 5., -2.,  4.,  3.])
一艘班轮:

pd.Series([df.values[i][df.fillna(0).abs().values.argmax(axis=1)[i]] for i in range(len(df.values))])
我解决了这个问题

maxCol=lambda x: max(x.min(), x.max(), key=abs)
df.apply(maxCol,axis=1)

由于我的声誉分数较低,我想在这里补充安德鲁·哈默尔关于绝对最小值的回答和问题:

minCol=lambda x: min(x, key=abs)
minCol=lambda x: min([abs(value) for value in x])  

适用于我的数据,但是,它无法处理np.nan。

最简单有效的方法是将其转换为绝对值,然后找到最大值。Pandas支持简单的语法(and),并且不需要昂贵的应用操作:

df.abs().max()

max()
接受一个
axis
参数,该参数可用于指定是计算行上的最大值还是列上的最大值。

执行
dropna
操作时,将丢失所有具有
NaN
值的列,并且只有
c
列是leftOk。在任何情况下,如果我使用df.max(axis=1,key=abs),它不会取绝对值中的最大值,但只取最大正值。此解决方案有效,但速度非常慢。。。有更快的解决方案吗?我如何修改它,使其采用绝对最小值?我试图用min-so-min(x.min(),x.max(),key=abs)替换max,但这不起作用。@如果您有性能问题,我下面的答案应该更有效。@Andrewamel在我下面的答案中用
min()
替换
max()
,应该可以work@Brendan我希望(以及OP)保持负值。你的方法会将它们转换为正值这不会回答问题,因为它会删除负值。
df.abs().max()