如何使用pandas drop nan number,而不是掉落所有的行

时间:2016-06-28 05:52:04

标签: python list pandas dataframe nan

我只需要删除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]]

哪种方法可以做得更好?

4 个答案:

答案 0 :(得分:1)

我认为问题是从NaN移除DataFrame,非常好解释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

转换为list L,然后移除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]]

答案 1 :(得分:1)

@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

答案 2 :(得分:0)

试试这个:

df.replace('NaN', 0)

然后简单地排除0

df = df[df[] > 0]

答案 3 :(得分:-2)

如果要打印数据框(df)而不显示“nan”,可以通过

将其替换为空白
df2=df.fillna("")

结果数据帧(df2)将具有与原始数据相同的行数和列数,但是空白而不是nan。