我正在尝试获取两个pandas
Series
之间的最小值。碰巧该系列中的某些元素是 NaN
,我希望在与数字比较时得到 NaN
结果。
为什么我使用np.min
函数
我使用了np.min
函数。这是因为我知道使用 min
函数会导致错误,因为当列表中存在 NaN
元素时,输出取决于列表中的顺序。
当我运行时:
import numpy as np
print min([1,np.nan])
print min([np.nan,1])
我得到的结果是:
>>>
1
nan
当我运行时:
import numpy as np
print np.min([np.nan,1])
print np.min([1,np.nan])
我得到了我所期望的:
>>>
nan
nan
用于查找两个 pandas
系列之间最小值的玩具示例代码
考虑到之前的结果,我使用了np.min
函数。但是,如果我使用两个 Series
运行以下玩具示例代码,创建一个 DataFrame
并找到最小值,我会得到数字而不是 NaN
作为我预计当 NaN
和数字进行比较时。
import pandas as pd
import numpy as np
s1 = pd.Series([1,2,3,4,5])
s2 = pd.Series([np.nan, np.nan, np.nan, 0, np.nan])
df1 = pd.DataFrame([s1,s2])
df2 = pd.DataFrame([s2,s1])
r1 = np.min(df1,axis=0)
r2 = np.min(df2,axis=0)
print r1
print r2
这会产生以下打印结果:
>>>
0 1.0
1 2.0
2 3.0
3 0.0
4 5.0
dtype: float64
0 1.0
1 2.0
2 3.0
3 0.0
4 5.0
dtype: float64
但是我希望结果与 Serie
s2
相同,即 DataFrame
df1
:
>>> df1
0 1 2 3 4
0 1.0 2.0 3.0 4.0 5.0
1 NaN NaN NaN 0.0 NaN
问题
在查找使用两个系列创建的DataFrame
的最小值时,是否缺少某个函数或者我做错了什么?我希望 NaN
成为数字和 NaN
元素比较时的结果...
注意:我使用的是 python 2.7
以及 numpy 1.13.3
和 pandas 0.22.0
最佳答案
IIUC,您可以将系列的值
作为np.array
传递给np.min
,并且您会得到您想要的行为期望来自np.min
:
>>> np.min(df2.values,axis=0)
array([nan, nan, nan, 0., nan])
>>> np.min(df1.values,axis=0)
array([nan, nan, nan, 0., nan])
您还可以将参数 skipna=False
应用于 pands.DataFrame.min
,以考虑 NaN
值:
>>> df1.min(axis=0, skipna=False)
0 NaN
1 NaN
2 NaN
3 0.0
4 NaN
dtype: float64
>>> df2.min(axis=0, skipna=False)
0 NaN
1 NaN
2 NaN
3 0.0
4 NaN
dtype: float64
关于python - 按列查找包含 NaN 元素的 pandas DataFrame 的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51827377/