【问题标题】:Generate New DataFrame without NaN Values生成没有 NaN 值的新 DataFrame
【发布时间】:2021-11-18 07:16:26
【问题描述】:

我有以下数据框:

     a    b    c    d    e
0  NaN  2.0  NaN  4.0  5.0
1  NaN  2.0  3.0  NaN  5.0
2  1.0  NaN  3.0  4.0  NaN
3  1.0  2.0  NaN  4.0  NaN
4  NaN  2.0  NaN  4.0  5.0

我尝试生成一个没有 NaN 值的新数据框。 一行中总是有相同数量的 NaN 值。

最终的 Dataframe 应该如下所示:

   x  y  z
0  2  4  5
1  2  3  5
2  1  3  4
3  1  2  4
4  2  4  5

有人知道一个简单的方法来做到这一点吗? 任何帮助表示赞赏。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用数组索引:

    pd.DataFrame(df.values[df.notnull().values].reshape(df.shape[0],3),
                 columns=list('xyz'),dtype=int)
    
        x   y   z
    0   2   4   5
    1   2   3   5
    2   1   3   4
    3   1   2   4
    4   2   4   5
    

    如果dataframe 跨行有更多的不一致值,例如第 1 行有 4 个值,而第 2 行有 3 个值,则可以这样做:

        a   b   c   d   e   g
    0   NaN 2.0 NaN 4.0 5.0 6.0
    1   NaN 2.0 3.0 NaN 5.0 NaN
    2   1.0 NaN 3.0 4.0 NaN NaN
    3   1.0 2.0 NaN 4.0 NaN NaN
    4   NaN 2.0 NaN 4.0 5.0 NaN
    
    pd.DataFrame(df.apply(lambda x: x.values[x.notnull()],axis=1).tolist())
    
        0   1   2   3
    0   2.0 4.0 5.0 6.0
    1   2.0 3.0 5.0 NaN
    2   1.0 3.0 4.0 NaN
    3   1.0 2.0 4.0 NaN
    4   2.0 4.0 5.0 NaN
    

    这里我们不能删除最后一列中的NaN's

    【讨论】:

      【解决方案2】:

      使用justify函数并选择前3列:

      df = pd.DataFrame(justify(df.values,invalid_val=np.nan)[:, :3].astype(int),
                        columns=list('xyz'), 
                        index=df.index)
      print (df)
         x  y  z
      0  2  4  5
      1  2  3  5
      2  1  3  4
      3  1  2  4
      4  2  4  5
      

      【讨论】:

        【解决方案3】:

        如果如您的示例所示,列中的值增加,您可以对 axis=1 进行排序:

        res = pd.DataFrame(np.sort(df.values, 1)[:, :3],
                           columns=list('xyz'), dtype=int)
        
        print(res)
        
           x  y  z
        0  2  4  5
        1  2  3  5
        2  1  3  4
        3  1  2  4
        4  2  4  5
        

        【讨论】:

          【解决方案4】:

          你可以使用熊猫的方法来处理数据框df.fillna()

          此方法用于将 NaN 或 NA 转换为给定的参数。

          df.fillna(替换Nan的参数)

          import numpy as np
          import pandas as pd
              
              data = {
                   'A':[np.nan,  2.0,  np.nan,  4.0,  5.0],
                   'B':[np.nan,  2.0,  3.0,  np.nan,  5.0],
                   'C':[1.0 , np.nan,  3.0,  4.0,  np.nan],
                   'D':[1.0 , 2.0,  np.nan,  4.0,  np.nan,],
                   'E':[np.nan,  2.0,  np.nan,  4.0,  5.0]
                  }
              df = pd.DataFrame(data)
              print(df)
          
              
                   A    B    C    D    E
              0  NaN  NaN  1.0  1.0  NaN
              1  2.0  2.0  NaN  2.0  2.0
              2  NaN  3.0  3.0  NaN  NaN
              3  4.0  NaN  4.0  4.0  4.0
              4  5.0  5.0  NaN  NaN  5.0
              
              df = df.fillna(0) # Applying the method with parameter 0
              print(df)
          
                   A    B    C    D    E
              0  0.0  0.0  1.0  1.0  0.0
              1  2.0  2.0  0.0  2.0  2.0
              2  0.0  3.0  3.0  0.0  0.0
              3  4.0  0.0  4.0  4.0  4.0
              4  5.0  5.0  0.0  0.0  5.0
          

          如果您想将此方法应用于特定列,则语法如下所示

          df[column_name] = df[column_name].fillna(param)

          df['A'] = df['A'].fillna(0)
          print(df)
          
               A    B    C    D    E
          0  0.0  NaN  1.0  1.0  NaN
          1  2.0  2.0  NaN  2.0  2.0
          2  0.0  3.0  3.0  NaN  NaN
          3  4.0  NaN  4.0  4.0  4.0
          4  5.0  5.0  NaN  NaN  5.0
          

          你也可以使用Python的replace()方法替换np.nan

          df = df.replace(np.nan,0)
          print(df)
          
           A    B    C    D    E
          0  0.0  0.0  1.0  1.0  0.0
          1  2.0  2.0  0.0  2.0  2.0
          2  0.0  3.0  3.0  0.0  0.0
          3  4.0  0.0  4.0  4.0  4.0
          4  5.0  5.0  0.0  0.0  5.0
          
          df['A'] = df['A'].replace() # Replacing only column A
          
          print(df)
          
          A    B    C    D    E
          0  0.0  NaN  1.0  1.0  NaN
          1  2.0  2.0  NaN  2.0  2.0
          2  0.0  3.0  3.0  NaN  NaN
          3  4.0  NaN  4.0  4.0  4.0
          4  5.0  5.0  NaN  NaN  5.0
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-09-23
            • 2020-07-10
            • 2017-03-13
            • 1970-01-01
            相关资源
            最近更新 更多