代码之家  ›  专栏  ›  技术社区  ›  Cedric Zoppolo

按列查找包含NaN元素的pandas数据框的最小值

  •  2
  • Cedric Zoppolo  · 技术社区  · 6 年前

    我试图得到两个之间的最小值 pandas Series NaN ,我想得到结果

    为什么我用 np.min 功能

    我用过 np.min.最小值 功能。这是因为我明白 min 元素存在于列表中。

    当我跑的时候:

    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
    

    寻找两个之间最小值的玩具示例代码 熊猫 系列

    考虑到以前的结果 功能。但是如果我用两个 系列 DataFrame 找到最小值,我得到数字,而不是

    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 数据帧 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
    

    是否缺少某个函数,或者在为 数据帧

    注意 :我正在使用 python 2.7 具有 numpy 1.13.3 pandas 0.22.0

    2 回复  |  直到 6 年前
        1
  •  3
  •   sacuL    6 年前

    IIUC,你可以通过 values 系列中的 np.min 作为 np.array ,你会得到你期望的行为 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
    
        2
  •  1
  •   rafaelc    6 年前

    IIUC,这是 np.minimum

    最小值。 如果被比较的元素之一是NaN,那么 返回元素。 如果两个元素都是nan,那么第一个元素是 返回。

    r1 = np.minimum(df1.loc[0, :], df1.loc[1, :])
    r2 = np.minimum(df2.loc[0,:], df2.loc[1, :])