【问题标题】:Pandas print missing value column names and count only熊猫打印缺失值列名并仅计数
【发布时间】:2020-01-22 15:58:47
【问题描述】:

我正在使用以下代码打印缺失值计数和列名。

#Looking for missing data and then handling it accordingly
def find_missing(data):
# number of missing values
count_missing = data_final.isnull().sum().values
# total records
total = data_final.shape[0]
# percentage of missing
ratio_missing = count_missing/total
# return a dataframe to show: feature name, # of missing and % of missing
return pd.DataFrame(data={'missing_count':count_missing, 'missing_ratio':ratio_missing}, 
index=data.columns.values)
find_missing(data_final).head(5)

我想要做的是只打印那些缺少值的列,因为我有一个大约 150 列的庞大数据集。

数据集是这样的

A     B      C      D
123   ABC    X      Y
123   ABC    X      Y
NaN   ABC    NaN   NaN
123   ABC    NaN   NaN
245   ABC    NaN   NaN
345   ABC    NaN   NaN

在输出中我只想看到:

     missing_count   missing_ratio
C    4               0.66
D    4               0.66

而不是列 A 和 B,因为那里没有缺失值

【问题讨论】:

    标签: python-3.x pandas missing-data


    【解决方案1】:

    DataFrame.isnaDataFrame.sum 一起使用 按计数。我们也可以使用DataFrame.isnull 代替DataFrame.isna

    new_df = (df.isna()
                .sum()
                .to_frame('missing_count')
                .assign(missing_ratio = lambda x: x['missing_count']/len(df))
                .loc[df.isna().any()] )
    print(new_df)
    

    我们也可以使用pd.concat 代替DataFrame.assign

    count = df.isna().sum()
    new_df = (pd.concat([count.rename('missing_count'),
                         count.div(len(df))
                              .rename('missing_ratio')],axis = 1)
                 .loc[count.ne(0)])
    

    输出

       missing_count  missing_ratio
    A              1       0.166667
    C              4       0.666667
    D              4       0.666667
    

    【讨论】:

      【解决方案2】:

      IIUC,我们可以将缺失的计数和总计数分配给两个变量,做一些基本的数学运算,然后分配回一个 df。

      a = df.isnull().sum(axis=0)
      
      b = np.round(df.isnull().sum(axis=0) / df.fillna(0).count(axis=0),2)
      
      
      missing_df = pd.DataFrame({'missing_vals' : a,
                   'missing_ratio' : b})
      

      print(missing_df)
         missing_vals  ratio
      A             1   0.17
      B             0   0.00
      C             4   0.67
      D             4   0.67
      

      您可以过滤掉没有任何缺失值的列

      missing_df = missing_df[missing_df.missing_vals.ne(0)]
      print(missing_df)
      missing_vals  ratio
      A             1   0.17
      C             4   0.67
      D             4   0.67
      

      【讨论】:

        【解决方案3】:

        你也可以使用concat:

        s = df.isnull().sum()
        result = pd.concat([s,s/len(df)],1)
        result.columns = ["missing_count","missing_ratio"]
        print (result)
        
           missing_count  missing_ratio
        A              1       0.166667
        B              0       0.000000
        C              4       0.666667
        D              4       0.666667
        

        【讨论】:

        • 这就像我的解决方案
        猜你喜欢
        • 1970-01-01
        • 2021-04-17
        • 2021-07-02
        • 1970-01-01
        • 2020-03-19
        • 2020-10-20
        • 2022-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多