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

Python 如何在忽略NaN的几列中找到具有最小绝对值的值?,python,numpy,pandas,Python,Numpy,Pandas,我有以下两个熊猫时间序列(但这个问题也适用于numpy阵列): 我想用以下方式将这两个专栏结合起来。如果两列都包含NaN,则结果列将获得NaN,否则我们将获得具有最小绝对值的值 例如,在考虑的情况下,我们应该得到: NaN 2 1 0 -1 -2 -3 -4 4 3 2 让,df具有两列的数据帧使用axis=1对行应用条件绝对最小值 这里,x[np.argmin(x.abs())]用绝对最小值检查行索引,并返回带符号的原始值 此外,我们还需要pd.isnull(x.min())检

我有以下两个熊猫时间序列(但这个问题也适用于numpy阵列):

我想用以下方式将这两个专栏结合起来。如果两列都包含
NaN
,则结果列将获得
NaN
,否则我们将获得具有最小绝对值的值

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

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

让,
df
具有两列的数据帧使用
axis=1对行应用条件绝对最小值

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

此外,我们还需要
pd.isnull(x.min())
检查遇到的
'All-NaN切片
,即当两列都有
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

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

因此,这将检查任一列是否为空如果是,则返回最小值,然后比较任一列的abs值,然后返回abs值最小但原始值包含符号的列:

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
[269]中的

def func(x):
如果pd.isnull(x.a)或pd.isnull(x.b):
返回x.min()
如果np.abs(x.a)
@EdChum当我发布最初的答案时,我也感到困惑。OP的意思是用最小的绝对值得到值。带着标志
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