【问题标题】:Find out the percentage of missing values in each column in the given dataset找出给定数据集中每列中缺失值的百分比
【发布时间】:2018-12-06 20:00:31
【问题描述】:
import pandas as pd
df = pd.read_csv('https://query.data.world/s/Hfu_PsEuD1Z_yJHmGaxWTxvkz7W_b0')
percent= 100*(len(df.loc[:,df.isnull().sum(axis=0)>=1 ].index) / len(df.index))
print(round(percent,2))

输入是https://query.data.world/s/Hfu_PsEuD1Z_yJHmGaxWTxvkz7W_b0

输出应该是

Ord_id                 0.00
Prod_id                0.00
Ship_id                0.00
Cust_id                0.00
Sales                  0.24
Discount               0.65
Order_Quantity         0.65
Profit                 0.65
Shipping_Cost          0.65
Product_Base_Margin    1.30
dtype: float64

【问题讨论】:

  • 您需要遍历列,每列打印一次。你还没有写一个循环来做到这一点。你被困在哪里了?
  • 另外@Prune 迭代是他在pandas 中应该做的最后一件事
  • @user3483203 好点——应该建立一个结果向量。

标签: python python-3.x pandas numpy


【解决方案1】:

我找到的最佳解决方案 - (仅显示缺失的列)

missing_values = [feature for feature in df.columns if df[feature].isnull().sum() > 1]

for feature in missing_values:
  print(f"{feature} {np.round(df[feature].isnull().mean(), 4)}% missing values")

【讨论】:

    【解决方案2】:

    试试这个解决方案

    
    import pandas as pd
    df = pd.read_csv('https://query.data.world/s/Hfu_PsEuD1Z_yJHmGaxWTxvkz7W_b0')
    print(round(100*(df.isnull().sum()/len(df.index)),2))
    
    

    【讨论】:

      【解决方案3】:
      import numpy as np
      
      import pandas as pd
      
      df = pd.read_csv('https://query.data.world/s/Hfu_PsEuD1Z_yJHmGaxWTxvkz7W_b0')
      
      df.loc[np.isnan(df['Product_Base_Margin']),['Product_Base_Margin']]=df['Product_Base_Margin'].mean()
      
      print(round(100*(df.isnull().sum()/len(df.index)), 2))
      

      【讨论】:

        【解决方案4】:

        单线解决方案

        df.isnull().mean().round(4).mul(100).sort_values(ascending=False)
        

        【讨论】:

        • 如果需要,您还可以将其转换为数据框以进行进一步操作(仍然是单行):pd.DataFrame(df.isnull().mean().round(4).mul(100).sort_values(ascending=False), columns=['Percentage Missing'])
        【解决方案5】:

        让我们分解你的问题

        1. 你想要缺失值的百分比
        2. 应按升序排序,并将值四舍五入为2个浮点数

        解释:

        1. dhr[fill_cols].isnull().sum() - 逐列给出缺失值的总数
        2. dhr.shape[0] - 给出总行数
        3. (dhr[fill_cols].isnull().sum()/dhr.shape[0]) - 为您提供一个以百分比为值、以列名为索引的系列
        4. 由于输出是一个系列,您可以根据值进行舍入和排序

        代码:

        (dhr[fill_cols].isnull().sum()/dhr.shape[0]).round(2).sort_values()
        

        参考: sort, round

        【讨论】:

          【解决方案6】:

          对我来说,我就是这样做的:

          def missing_percent(df):
                  # Total missing values
                  mis_val = df.isnull().sum()
                  
                  # Percentage of missing values
                  mis_percent = 100 * df.isnull().sum() / len(df)
                  
                  # Make a table with the results
                  mis_table = pd.concat([mis_val, mis_percent], axis=1)
                  
                  # Rename the columns
                  mis_columns = mis_table.rename(
                  columns = {0 : 'Missing Values', 1 : 'Percent of Total Values'})
                  
                  # Sort the table by percentage of missing descending
                  mis_columns = mis_columns[
                      mis_columns.iloc[:,1] != 0].sort_values(
                  'Percent of Total Values', ascending=False).round(2)
                  
                  # Print some summary information
                  print ("Your selected dataframe has " + str(df.shape[1]) + " columns.\n"      
                      "There are " + str(mis_columns.shape[0]) +
                        " columns that have missing values.")
                  
                  # Return the dataframe with missing information
                  return mis_columns
          

          【讨论】:

            【解决方案7】:

            通过以下代码,您可以从每一列中获取相应的百分比值。只需将名称 train_data 切换为 df,以防您使用。

            输入:

            In [1]:
            
            all_data_na = (train_data.isnull().sum() / len(train_data)) * 100
            all_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)[:30]
            missing_data = pd.DataFrame({'Missing Ratio' :all_data_na})
            missing_data.head(20)
            

            输出:

            Out[1]: 
                                            Missing Ratio
             left_eyebrow_outer_end_x       68.435239
             left_eyebrow_outer_end_y       68.435239
             right_eyebrow_outer_end_y      68.279189
             right_eyebrow_outer_end_x      68.279189
             left_eye_outer_corner_x        67.839410
             left_eye_outer_corner_y        67.839410
             right_eye_inner_corner_x       67.825223
             right_eye_inner_corner_y       67.825223
             right_eye_outer_corner_x       67.825223
             right_eye_outer_corner_y       67.825223
             mouth_left_corner_y            67.811037
             mouth_left_corner_x            67.811037
             left_eyebrow_inner_end_x       67.796851
             left_eyebrow_inner_end_y       67.796851
             right_eyebrow_inner_end_y      67.796851
             mouth_right_corner_x           67.796851
             mouth_right_corner_y           67.796851
             right_eyebrow_inner_end_x      67.796851
             left_eye_inner_corner_x        67.782664
             left_eye_inner_corner_y        67.782664
            

            【讨论】:

              【解决方案8】:

              如果下面有多个数据框,则该函数以百分比计算每列中缺失值的数量

              def miss_data(df):
                  x = ['column_name','missing_data', 'missing_in_percentage']
                  missing_data = pd.DataFrame(columns=x)
                  columns = df.columns
                  for col in columns:
                      icolumn_name = col
                      imissing_data = df[col].isnull().sum()
                      imissing_in_percentage = (df[col].isnull().sum()/df[col].shape[0])*100
              
                      missing_data.loc[len(missing_data)] = [icolumn_name, imissing_data, imissing_in_percentage]
                  print(missing_data) 
              

              【讨论】:

                【解决方案9】:

                您正在寻找的解决方案是:

                round(df.isnull().mean()*100,2) 
                

                这会将百分比四舍五入到小数点后 2 位

                另一种方法是

                round((df.isnull().sum()*100)/len(df),2)
                

                但这并不像使用 mean() 那样有效。

                【讨论】:

                  【解决方案10】:
                  import numpy as np
                  import pandas as pd
                  
                  raw_data = {'first_name': ['Jason', np.nan, 'Tina', 'Jake', 'Amy'], 
                          'last_name': ['Miller', np.nan, np.nan, 'Milner', 'Cooze'], 
                          'age': [22, np.nan, 23, 24, 25], 
                          'sex': ['m', np.nan, 'f', 'm', 'f'], 
                          'Test1_Score': [4, np.nan, 0, 0, 0],
                          'Test2_Score': [25, np.nan, np.nan, 0, 0]}
                  results = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'sex', 'Test1_Score', 'Test2_Score'])
                  
                  
                  results 
                  
                    first_name last_name   age  sex  Test1_Score  Test2_Score
                  0      Jason    Miller  22.0    m          4.0         25.0
                  1        NaN       NaN   NaN  NaN          NaN          NaN
                  2       Tina       NaN  23.0    f          0.0          NaN
                  3       Jake    Milner  24.0    m          0.0          0.0
                  4        Amy     Cooze  25.0    f          0.0          0.0
                  

                  您可以使用以下函数,它将在 Dataframe 中为您提供输出

                  • 零值
                  • 缺失值
                  • 占总价值的百分比
                  • 总缺失值为零
                  • % 总零缺失值
                  • 数据类型

                  只需复制并粘贴以下函数并通过传递您的 pandas Dataframe 来调用它

                  def missing_zero_values_table(df):
                          zero_val = (df == 0.00).astype(int).sum(axis=0)
                          mis_val = df.isnull().sum()
                          mis_val_percent = 100 * df.isnull().sum() / len(df)
                          mz_table = pd.concat([zero_val, mis_val, mis_val_percent], axis=1)
                          mz_table = mz_table.rename(
                          columns = {0 : 'Zero Values', 1 : 'Missing Values', 2 : '% of Total Values'})
                          mz_table['Total Zero Missing Values'] = mz_table['Zero Values'] + mz_table['Missing Values']
                          mz_table['% Total Zero Missing Values'] = 100 * mz_table['Total Zero Missing Values'] / len(df)
                          mz_table['Data Type'] = df.dtypes
                          mz_table = mz_table[
                              mz_table.iloc[:,1] != 0].sort_values(
                          '% of Total Values', ascending=False).round(1)
                          print ("Your selected dataframe has " + str(df.shape[1]) + " columns and " + str(df.shape[0]) + " Rows.\n"      
                              "There are " + str(mz_table.shape[0]) +
                                " columns that have missing values.")
                  #         mz_table.to_excel('D:/sampledata/missing_and_zero_values.xlsx', freeze_panes=(1,0), index = False)
                          return mz_table
                  
                  missing_zero_values_table(results)
                  

                  输出

                  Your selected dataframe has 6 columns and 5 Rows.
                  There are 6 columns that have missing values.
                  
                               Zero Values  Missing Values  % of Total Values  Total Zero Missing Values  % Total Zero Missing Values Data Type
                  last_name              0               2               40.0                          2                         40.0    object
                  Test2_Score            2               2               40.0                          4                         80.0   float64
                  first_name             0               1               20.0                          1                         20.0    object
                  age                    0               1               20.0                          1                         20.0   float64
                  sex                    0               1               20.0                          1                         20.0    object
                  Test1_Score            3               1               20.0                          4                         80.0   float64
                  

                  如果你想保持简单,那么你可以使用下面的函数来获取 % 中的缺失值

                  def missing(dff):
                      print (round((dff.isnull().sum() * 100/ len(dff)),2).sort_values(ascending=False))
                  
                  
                  missing(results)
                  
                  Test2_Score    40.0
                  last_name      40.0
                  Test1_Score    20.0
                  sex            20.0
                  age            20.0
                  first_name     20.0
                  dtype: float64
                  

                  【讨论】:

                    【解决方案11】:

                    这个怎么样?我想我实际上曾经在这里发现过类似的东西,但我现在没有看到它......

                    percent_missing = df.isnull().sum() * 100 / len(df)
                    missing_value_df = pd.DataFrame({'column_name': df.columns,
                                                     'percent_missing': percent_missing})
                    

                    如果您想要对缺失的百分比进行排序,请按照上述说明:

                    missing_value_df.sort_values('percent_missing', inplace=True)
                    

                    如 cmets 中所述,您也可以只使用我上面代码中的第一行,即:

                    percent_missing = df.isnull().sum() * 100 / len(df)
                    

                    【讨论】:

                    • 我认为你不需要第一行和最后一行。中线产生他想要的结果
                    • 我不知道,他显示的输出看起来像是一个复制和粘贴的 pandas 数据框本身,因此我正在从现有的列构建一个数据框,并且它们的百分比缺失。但我们会看看 OP 怎么说。
                    • 它最后没有打印 dtype float 64
                    • @Shaswata 是的,看起来你可以通过 df.isnull().sum()... 获得输出。正如 cmets 中指出的那样,将其添加到我的答案中。
                    【解决方案12】:

                    更新让我们使用meanisnull

                    df.isnull().mean() * 100
                    

                    输出:

                    Ord_id                 0.000000
                    Prod_id                0.000000
                    Ship_id                0.000000
                    Cust_id                0.000000
                    Sales                  0.238124
                    Discount               0.654840
                    Order_Quantity         0.654840
                    Profit                 0.654840
                    Shipping_Cost          0.654840
                    Product_Base_Margin    1.297774
                    dtype: float64
                    

                    IIUC:

                    df.isnull().sum() / df.shape[0] * 100.00
                    

                    输出:

                    Ord_id                 0.000000
                    Prod_id                0.000000
                    Ship_id                0.000000
                    Cust_id                0.000000
                    Sales                  0.238124
                    Discount               0.654840
                    Order_Quantity         0.654840
                    Profit                 0.654840
                    Shipping_Cost          0.654840
                    Product_Base_Margin    1.297774
                    dtype: float64
                    

                    【讨论】:

                    • 如何删除缺失百分比超过30%的列?
                    • @Ahbon 您可以使用以下内容:df.loc[:, df.isnull().mean() < .30]
                    【解决方案13】:

                    覆盖所有缺失的值并对结果进行四舍五入:

                    ((df.isnull() | df.isna()).sum() * 100 / df.index.size).round(2)
                    

                    输出:

                    Out[556]: 
                    Ord_id                 0.00
                    Prod_id                0.00
                    Ship_id                0.00
                    Cust_id                0.00
                    Sales                  0.24
                    Discount               0.65
                    Order_Quantity         0.65
                    Profit                 0.65
                    Shipping_Cost          0.65
                    Product_Base_Margin    1.30
                    dtype: float64
                    

                    【讨论】:

                    • isnullisna 是别名,据我所知
                    • @IanS,是的,目前。但如果它们是可互换的,其中一个可以在未来的版本中以某种方式扩展,或者可以删除其中一个。因此,在一种情况下,我们有一个高级操作,在第二种情况下,我们有一个潜在的指示点来显示哪个功能是实际的。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-10-28
                    • 1970-01-01
                    • 2022-07-08
                    • 2022-08-23
                    • 1970-01-01
                    • 2021-10-08
                    • 2019-08-08
                    相关资源
                    最近更新 更多