如何在忽略NaN的几列中找到具有最小绝对值的值?

时间:2015-04-22 12:14:20

标签: python numpy pandas

我有以下两个pandas时间序列(但问题也适用于numpy数组):

NaN               NaN
NaN               2
NaN               1
NaN               0
NaN              -1
NaN              -2
6                -3
5                -4
4                -5
3                NaN
2                NaN

我想以下列方式组合这两列。如果两列都包含NaN,则结果列会获得NaN,否则我们会获得具有最小绝对值的值。

例如在我们应该考虑的情况下:

 NaN
 2
 1
 0
-1
-2
-3
-4
 4
 3
 2

2 个答案:

答案 0 :(得分:1)

df数据框包含两列,使用axis=1

在行上应用条件绝对最小值

这里,x[np.argmin(x.abs())]检查行索引的绝对最小值,并用符号返回原始值。

另外,我们需要pd.isnull(x.min())检查'All-NaN slice encountered,即两列的值都为NaN

In [3]: df.apply(lambda x: x.min() if pd.isnull(x.min()) else
                           x[np.argmin(x.abs())], axis=1)
Out[3]:
0    NaN
1      2
2      1
3      0
4     -1
5     -2
6     -3
7     -4
8      4
9      3
10     2
dtype: float64

答案 1 :(得分:1)

好的,在阅读并理解了您的问题而无法找到矢量化方法之后,我们可以定义一个自定义函数并调用apply并传递每一行。

因此,这将检查任一列是否为null,如果返回min值,则它会比较任一列的abs值,然后返回具有最小abs值但原始值包括sign的列:

In [269]:

def func(x):
    if pd.isnull(x.a) or pd.isnull(x.b):
        return x.min()
    elif np.abs(x.a) < np.abs(x.b):
        return x.a
    else:
        return x.b

df.apply(lambda row: func(row), axis = 1)
Out[269]:
0    NaN
1      2
2      1
3      0
4     -1
5     -2
6     -3
7     -4
8      4
9      3
10     2
dtype: float64