在熊猫中连续检查多个空白字段

时间:2018-09-18 05:47:07

标签: python pandas

我必须检查多列的空白。我该如何有效地做到这一点。 我正在检查单列每一行的空白,如下所示-

for item, frame in df['Column_1'].notnull().iteritems():
    if(frame != False):
        print item , frame

我需要一个数据框,其中column_1,column_2和column_3上的行不为空。

1 个答案:

答案 0 :(得分:1)

我认为需要按子集过滤列,然后检查所有缺失值,并按DataFrame.all获取所有True的行,最后按boolean indexing进行过滤:

cols = ['Column_1','Column_2','Column_3']
df1 = df[df[cols].notnull().all(axis=1)]

最好将dropna与参数subset一起使用:

df1 = df.dropna(subset=cols)

示例

df = pd.DataFrame({'A':list('abcdef'),
                   'Column_1':[np.nan,5,4,5,5,4],
                   'Column_2':[np.nan,8,np.nan,4,2,3],
                   'Column_3':[np.nan,3,5,np.nan,1,0],
                   'E':[5,3,6,9,2,np.nan],
                   'F':list('aaabbb')})

print (df)
   A  Column_1  Column_2  Column_3    E  F
0  a       NaN       NaN       NaN  5.0  a
1  b       5.0       8.0       3.0  3.0  a
2  c       4.0       NaN       5.0  6.0  a
3  d       5.0       4.0       NaN  9.0  b
4  e       5.0       2.0       1.0  2.0  b
5  f       4.0       3.0       0.0  NaN  b

cols = ['Column_1','Column_2','Column_3']
df1 = df.dropna(subset=cols)
print (df1)
   A  Column_1  Column_2  Column_3    E  F
1  b       5.0       8.0       3.0  3.0  a
4  e       5.0       2.0       1.0  2.0  b
5  f       4.0       3.0       0.0  NaN  b

性能

在较小的DataFrame中,boolean indexing是更快的解决方案,但它也取决于缺失值的数量。

graph

代码:

np.random.seed(123)

import perfplot

cols = ['Column_1','Column_2','Column_3']

def boolean_indexing(df):
    df1 = df[df[cols].notnull().all(axis=1)]
    return df1

def dropna_func(df):
    df1 = df.dropna(subset=cols)
    return df1

def make_df(n):
    df = pd.DataFrame({'Column_1':np.random.choice([1,2,3,np.nan], size=n),
                       'Column_2':np.random.choice([1,2,3,4,5,6,7,8,np.nan], size=n),
                       'Column_3':np.random.choice([1,2,3,4,8,0,10,11,5,6,np.nan], size=n),
                       'E':np.random.choice([1,2,3,np.nan], size=n)})
    return df

perfplot.show(
    setup=make_df,
    kernels=[boolean_indexing, dropna_func],
    n_range=[2**k for k in range(2, 20)],
    logx=True,
    logy=True,
    equality_check=False,
    xlabel='len(df)')