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

时间:2015-12-07 10:24:44

标签: 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

5 个答案:

答案 0 :(得分:9)

我解决了

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

df = df.fillna(0)
l = df.abs().values.argmax(axis=1)
pd.Series([df.values[i][l[i]] for i in range(len(df.values))])

In [532]: pd.Series([df.values[i][l[i]] for i in range(len(df.values))])
Out[532]:
0    5
1   -2
2    4
3    3
dtype: float64

一个班轮:

pd.Series([df.values[i][df.fillna(0).abs().values.argmax(axis=1)[i]] for i in range(len(df.values))])

答案 3 :(得分:0)

由于我的声誉得分很低,我想在此补充gis20的答案以及安德鲁·哈默尔(Andrew Hamel)有关绝对最小值的问题:

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

适用于我的数据,但是不能应付np.nan的数据。

答案 4 :(得分:0)

最直接,最有效的方法是转换为绝对值,然后找到最大值。 Pandas通过简单的语法(absmax)支持此操作,并且不需要昂贵的套用操作:

df.abs().max()

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