【问题标题】:how to use pandas drop nan number, not drop all the row如何使用pandas drop nan number,而不是删除所有行
【发布时间】:2016-10-30 07:08:45
【问题描述】:

我只需要删除NaN 元素,而不是删除所有行。

我有一个 python 数据框列表,例如:

[[2.0, 3.0, 5.0, nan], [1.0, 3.0, 5.0, 6.0], [2.0, 5.0, nan, nan]]

如何使用 pandas 将其更改如下:只需删除 NaN 元素

[[2.0, 3.0, 5.0], [1.0, 3.0, 5.0, 6.0], [2.0, 5.0]]

哪种方法可以做得更好?

【问题讨论】:

  • [[2.0, 3.0, 5.0, nan], [1.0, 3.0, 5.0, 6.0], [2.0, 5.0, nan, nan]] 是一列还是DataFrame ?
  • 你没有显示任何方法。
  • @ChristophTerasa 我只想知道,哪种方法可以做到这一点。
  • @jezrael 它是一个数据框
  • @liugang 你说你自己找到了一个方法,并要求一个“更好”的方法,但我没有看到任何类似于代码的东西。由于pandas.DataFrames 需要是矩形(NxM),缺失值将在创建时用NaN 填充。您要么必须处理 NaN 值,要么不使用 pandas.DataFrame

标签: python list pandas dataframe nan


【解决方案1】:

如果你想打印数据框(df)而不显示“nan”,你可以用空白替换它

df2=df.fillna("")

生成的数据框 (df2) 将具有与原始相同的行数和列数,但为空白而不是 nan。

【讨论】:

  • 它将是:[[2.0, 3.0, 5.0, ''], [1.0, 3.0, 5.0, 6.0], [2.0, 5.0, '', '']]。不行
【解决方案2】:

试试这个:

df.replace('NaN', 0)

然后简单地排除 0

df = df[df[] > 0]

【讨论】:

    【解决方案3】:

    @jezrael 是正确的。 pandas 要求数据框是矩形的。但是,您可以更改矩形的形状。

    df = pd.DataFrame([[2.0, 3.0, 5.0, np.nan], [1.0, 3.0, 5.0, 6.0], [2.0, 5.0, np.nan, np.nan]])
    
    df
    
         0    1    2    3
    0  2.0  3.0  5.0  NaN
    1  1.0  3.0  5.0  6.0
    2  2.0  5.0  NaN  NaN
    
    df.stack()
    
    0  0    2.0
       1    3.0
       2    5.0
    1  0    1.0
       1    3.0
       2    5.0
       3    6.0
    2  0    2.0
       1    5.0
    dtype: float64
    

    【讨论】:

      【解决方案4】:

      我认为从DataFrame 中删除NaN 是个问题,很好解释Christoph Terasa

      由于 pandas.DataFrames 需要是矩形 (NxM),缺失值将在创建时用 NaN 填充。

      一种可能的解决方案是通过list comprehension 将其删除。

      df = pd.DataFrame([[2.0, 3.0, 5.0, np.nan], 
                         [1.0, 3.0, 5.0, 6.0], 
                         [2.0, 5.0, np.nan, np.nan]])
      
      print (df)
         0  1     2     3
      0  2  3     5   NaN
      1  1  3     5     6
      2  2  5   NaN   NaN
      

      通过values 转换为list 并通过isnull 按条件删除NaN

      感谢 Christoph Terasa 提供此解决方案:

      a = [[j for j in i if not pd.isnull(j)] for i in df.values]
      print (a)
      [[2.0, 3.0, 5.0], [1.0, 3.0, 5.0, 6.0], [2.0, 5.0]]
      

      我的旧解决方案:

      你可以先把NaN替换成None

      df = pd.DataFrame([[2.0, 3.0, 5.0, np.nan], 
                         [1.0, 3.0, 5.0, 6.0], 
                         [2.0, 5.0, np.nan, np.nan]])
      
      df = df.where((pd.notnull(df)), None)
      print (df)
         0  1     2     3
      0  2  3     5  None
      1  1  3     5     6
      2  2  5  None  None
      

      转换为listL,然后删除None

      L = [[2.0, 3.0, 5.0, None], [1.0, 3.0, 5.0, 6.0], [2.0, 5.0, None, None]]
      
      a = [[i for i in x if i != None] for x in L]
      
      print (a)
      [[2.0, 3.0, 5.0], [1.0, 3.0, 5.0, 6.0], [2.0, 5.0]]
      

      【讨论】:

      • 我认为先用None 填充DataFrame 有点不必要。你可以直接在DataFrame:a = [[j for j in i if not pd.isnull(j)] for i in df.values]上做列表推导。
      • 谢谢,我加了回答。
      • 很好,你也修正了我的错误。 :D
      • 我认为是错字;)
      猜你喜欢
      • 2017-12-22
      • 2015-08-28
      • 2014-09-28
      • 2018-10-29
      • 2020-07-05
      • 2021-02-20
      • 1970-01-01
      • 2019-01-12
      • 2017-05-11
      相关资源
      最近更新 更多