代码之家  ›  专栏  ›  技术社区  ›  iRyanBell

在大熊猫数据集的所有行中计算NaN列的有效方法?

  •  1
  • iRyanBell  · 技术社区  · 5 年前

    我正在计算整个数据集中丢失的列数,其中:

    missing_cols = X.apply(lambda x: x.shape[0] - x.dropna().shape[0], axis=1).value_counts().to_frame()
    

    当我运行这个程序时,我的ram使用量急剧增加。在卡格尔,这足以使机器崩溃。手术后 gc.collect() ,我似乎没有找回所有的记忆,暗示有某种泄漏。

    Maxed out

    我试着了解缺少1列数据、2列数据、3列数据等的行数。

    有没有更有效的方法来进行这种计算?

    2 回复  |  直到 5 年前
        1
  •  1
  •   ansev    5 年前

    要获取代码的输出,可以使用:

    df.isnull().sum(axis=1).value_counts().to_frame()
    

    这是一个例子:

    df=pd.DataFrame()
    df['col1']=[np.nan,1,3,5,np.nan]
    df['col2']=[2,np.nan,np.nan,3,6]
    df['col3']=[1,3,np.nan,4,np.nan]
    print(df)
    print(df.isnull().sum(axis=1))
    print(df.isnull().sum(axis=0))
    
    
       col1  col2  col3
    0   NaN   2.0   1.0
    1   1.0   NaN   3.0
    2   3.0   NaN   NaN
    3   5.0   3.0   4.0
    4   NaN   6.0   NaN
    0    1
    1    1
    2    2
    3    0
    4    2
    dtype: int64
    col1    2
    col2    2
    col3    2
    dtype: int64
    

    如您所见,可以按行和列获取nan值的计数

    现在做:

    df.isnull().sum(axis=1).value_counts().to_frame()
    
       0
    2  2
    1  2
    0  1
    
        2
  •  0
  •   Yaakov Bressler    5 年前

    你可以数数 na 按行使用以下值:

    df.isna().count(axis='rows')
    

    如果这会导致您的机器崩溃,我建议按块迭代。