我有以下两个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
答案 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