Python:如果所选列为空,则从Pandas数据框中删除行。

6
假设我有一个大的DataFrame,但我想集中精力处理其中的一部分,比如其中的4列中的3列。如果这些选定的3列中至少有2个值为空,我希望删除整行。
例如,这是我拥有的数据框,我的选定列是['B','C','D']:
 A   B   C   D
     1       1
 2           2
 3   3   3   3
 4         

如何在选择的第二行和第四行中至少有两个值为空的列中摆脱这些行。

最终数据框如下:

 A   B   C   D
     1       1
 3   3   3   3
2个回答

7

使用dropna时,结合subsetthresh参数。

In [2720]: df.dropna(subset=['B','C','D'], thresh=2)
Out[2720]:
     A    B    C    D
0  NaN  1.0  NaN  1.0
2  3.0  3.0  3.0  3.0

或者,使用notnull
In [2723]: df[df[['B', 'C', 'D']].notnull().sum(1).ge(2)]
Out[2723]:
     A    B    C    D
0  NaN  1.0  NaN  1.0
2  3.0  3.0  3.0  3.0

细节:
In [2722]: df
Out[2722]:
     A    B    C    D
0  NaN  1.0  NaN  1.0
1  2.0  NaN  NaN  2.0
2  3.0  3.0  3.0  3.0
3  4.0  NaN  NaN  NaN

如果值为空白而不是null,使用 df[df[['B', 'C', 'D']].eq('').sum(1).lt(2)] 或者 df[df[['B', 'C', 'D']].ne('').sum(1).ge(2)]


6

如果空值是NaN,请使用dropna

cols = ['B','C','D']

df = df.dropna(subset=cols, thresh=2)
#same as
#df = df[df[cols].isnull().sum(1) < 2]
print (df)
     A    B    C    D
0  NaN  1.0  NaN  1.0
2  3.0  3.0  3.0  3.0

如果空值是空字符串,则比较通过values创建的numpy数组,并通过布尔索引进行筛选:

df = df[(df[cols].values == '').sum(axis=1) < 2]

如果我使用这个函数,它会考虑所有的列,也许我的例子有误导性。 - s900n
我有一个非常大的数据框,但我想在选定的列上检查此条件,并相应地删除整行。 - s900n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接