我有一个pd.Series和标量值(浮点数和整数)的列表,我想查找其元素级最大值(系列都相同的长度)。如果有一个np.nan值,则应使用另一个值(如果只有nan,则为np.nan)。只要列表中的序列或值不包含nan值,此方法就可以正常工作,但是如果它们包含nan值,则nans会主导结果序列。

rv = input_list[0]
for s in input_list[1:]:
  rv = np.maximum(s, rv)


举个例子

input_list = [pd.Series([1, 2, 3, 1]), 2, pd.Series([3, 1, np.nan, 4])]


应该返回:

pd.Series([3, 2, 3, 4])


如何修改此代码以处理nan值,如果有替代值,则忽略它们?

最佳答案

使用numpy.nanmax的解决方案

您正在寻找numpy.nanmax。从其文档中:


  返回数组的最大值或沿轴的最大值,忽略任何
  NaNs。遇到所有NaN片时,将引发RuntimeWarning
  NaN将返回该切片。


因此,如果您知道该系列的最大大小为n

n= 4
result = pd.Series(np.nanmax(
    [np.full(n, i) if np.isscalar(i) else i for i in input_list], axis=0))


在示例上运行它:

input_list = [pd.Series([1, 2, 3, 1]), 2, pd.Series([3, 1, np.nan, 4])]
result = pd.Series(np.nanmax(
    [np.full(n, i) if np.isscalar(i) else i for i in input_list], axis=0))


输出:

0    3.0
1    2.0
2    3.0
3    4.0
dtype: float64

09-11 19:53