我必须检查多列的空白。我该如何有效地做到这一点。 我正在检查单列每一行的空白,如下所示-
for item, frame in df['Column_1'].notnull().iteritems():
if(frame != False):
print item , frame
我需要一个数据框,其中column_1,column_2和column_3上的行不为空。
答案 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
是更快的解决方案,但它也取决于缺失值的数量。
代码:
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)')