代码之家  ›  专栏  ›  技术社区  ›  Karn Kumar

如何从整个DataFrame中删除第一次出现“NaN”后的所有行

  •  1
  • Karn Kumar  · 技术社区  · 3 年前

    我期待在第一次出现后删除/删除所有行 NaN 基于任何dataFrame列。

    我创建了两个示例数据帧,如下图所示,第一个数据帧 dtypes 用于最初的两列 object 而最后一个在 int ,而在第二个数据帧中,这些是 float , obj int .

    第一

    >>> df = pd.DataFrame({"A": (1,2,3,4,5,6,7,'NaN','NaN','NaN','NaN'),"B": (1,2,3,'NaN',4,5,6,7,'NaN',"9","10"),"C": range(11)})
    >>> df
          A    B   C
    0     1    1   0
    1     2    2   1
    2     3    3   2
    3     4  NaN   3
    4     5    4   4
    5     6    5   5
    6     7    6   6
    7   NaN    7   7
    8   NaN  NaN   8
    9   NaN    9   9
    10  NaN   10  10
    

    D类型:

    >>> df.dtypes
    A    object
    B    object
    C     int64
    dtype: object
    

    当根据特定情况执行以下基于索引的方法时,只要 dtype obj int 但我正在寻找dataFrame级别的操作,而不仅仅局限于一列。

    >>> df[:df[df['A'] == 'NaN'].index[0]]
       A    B  C
    0  1    1  0
    1  2    2  1
    2  3    3  2
    3  4  NaN  3
    4  5    4  4
    5  6    5  5
    6  7    6  6
    
    >>> df[:df[df['B'] == 'NaN'].index[0]]
       A  B  C
    0  1  1  0
    1  2  2  1
    2  3  3  2
    

    第二

    使用创建DataFrame时的另一个有趣事实 np.nan 我们在哪里变得不同 数据类型 ,那么即使是基于索引的方法对于单列操作也失败了。

    >>> df = pd.DataFrame({"A": (1,2,3,4,5,6,7,np.nan,np.nan,np.nan,np.nan),"B": (1,2,3,np.nan,4,5,6,7,np.nan,"9","10"),"C": range(11)})
    >>> df
          A    B   C
    0   1.0    1   0
    1   2.0    2   1
    2   3.0    3   2
    3   4.0  NaN   3
    4   5.0    4   4
    5   6.0    5   5
    6   7.0    6   6
    7   NaN    7   7
    8   NaN  NaN   8
    9   NaN    9   9
    10  NaN   10  10
    

    数据类型:

    >>> df.dtypes
    A    float64
    B     object
    C      int64
    dtype: object
    

    错误

    >>> df[:df[df['B'] == 'NaN'].index[0]]
    IndexError: index 0 is out of bounds for axis 0 with size 0
    >>> df[:df[df['A'] == 'NaN'].index[0]]
    IndexError: index 0 is out of bounds for axis 0 with size 0
    

    第二个DataFrame应为:

    >>> df
          A    B   C
    0   1.0    1   0
    1   2.0    2   1
    2   3.0    3   2
    

    因此,我正在寻找一种方法来检查整个DataFrame,而不管 数据类型 并从数据帧中NaN的第一次出现起删除所有行。

    2 回复  |  直到 3 年前
        1
  •  3
  •   Anurag Dabas    3 年前

    您可以尝试:

    out=df.iloc[:df.isna().any(1).idxmax()]
    

    或者

    通过 replace() 使您的字符串“NaN’s to real”NaN‘s,然后检查是否缺少值并筛选行:

    df=df.replace({'NaN':float('NaN'),'nan':float('NaN')})
    out=df.iloc[:df.isna().any(1).idxmax()]
    

    的输出 out :

        A       B   C
    0   1.0     1   0
    1   2.0     2   1
    2   3.0     3   2
    
        2
  •  0
  •   Karn Kumar    3 年前

    只是为了子孙后代。。。

    >>> df.iloc[:df.isna().any(1).argmax()]
         A  B  C
    0  1.0  1  0
    1  2.0  2  1
    2  3.0  3  2
    
    >>> df.iloc[:df.isnull().any(1).argmax()]
         A  B  C
    0  1.0  1  0
    1  2.0  2  1
    2  3.0  3  2