Python 如何在忽略NaN的几列中找到具有最小绝对值的值?
我有以下两个熊猫时间序列(但这个问题也适用于numpy阵列): 我想用以下方式将这两个专栏结合起来。如果两列都包含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())检
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