过滤掉超过一定数量NaN的行

时间:2014-04-21 18:40:42

标签: python pandas dataframe filter

在Pandas数据框中,我想过滤掉所有超过2 NaN秒的行。

基本上,我有4列,我想只保留那些至少有2列有限值的行。

有人可以建议如何实现这个目标吗?

3 个答案:

答案 0 :(得分:6)

以下内容应该有效

df.dropna(thresh=2)

请参阅online docs

我们在这里做的是删除任何NaN行,其中一行中有2个或更多非NaN值。

示例:

In [25]:

import pandas as pd

df = pd.DataFrame({'a':[1,2,NaN,4,5], 'b':[NaN,2,NaN,4,5], 'c':[1,2,NaN,NaN,NaN], 'd':[1,2,3,NaN,5]})

df

Out[25]:

    a   b   c   d
0   1 NaN   1   1
1   2   2   2   2
2 NaN NaN NaN   3
3   4   4 NaN NaN
4   5   5 NaN   5

[5 rows x 4 columns]

In [26]:

df.dropna(thresh=2)

Out[26]:

   a   b   c   d
0  1 NaN   1   1
1  2   2   2   2
3  4   4 NaN NaN
4  5   5 NaN   5

[4 rows x 4 columns]

修改

对于上面的示例,它可以工作,但您应该注意,您必须知道列数并适当设置thresh值,我原先认为它意味着NaN值的数量,但它实际上是指 NaN值的数量。

答案 1 :(得分:5)

您在这里说了2个稍有不同的问题。在 general 案例中,他们有不同的答案。

  

我只想保留那些至少有两列的行   有限的值。

df = df.dropna(thresh=2)

保留行,其中包含2个或多个非空值


  

我想过滤出所有2个以上的行NaNs

df = df.dropna(thresh=df.shape[1]-2)

过滤出​​具有2个或更多空值的行。

在示例的4列数据框中,这些操作是等效的,因为df.shape[1] - 2 == 2。但是,您会注意到数据框没有正好有4列的差异。


如果您希望在应用阈值时仅包括指定的列,则注意dropna也有一个subset参数。例如:

df = df.dropna(subset=['col1', 'col2', 'col3'], thresh=2)

答案 2 :(得分:0)

我遇到了一个稍有不同的问题,即要过滤出的中含有超过一定数量的NaN:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[1,2,np.nan,4,5], 'b':[np.nan,2,np.nan,4,5], 'c':[1,2,np.nan,np.nan,np.nan], 'd':[1,2,3,np.nan,5]})
df

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

假设您要过滤出3个或多个Nan的列:

num_rows = df.shape[0]
drop_cols_with_this_amount_of_nans_or_more = 3
keep_cols_with_at_least_this_number_of_non_nans = num_rows - drop_cols_with_this_amount_of_nans_or_more + 1

df.dropna(axis=1,thresh=keep_cols_with_at_least_this_number_of_non_nans)

输出:(c列已按预期删除):

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