代码如下所示:
df=pd.DataFrame(np.random.randn(5,5),columns=list('abcde'))
df['g']=np.nan
df['h']=np.nan
df.ix[0,'g']=10
print(df.isnull())
print(df.isnull().values)#去掉values其结果也是一样的,返回类型为series
print(df.values[df.isnull().values==True])#true可以去掉
print(df[df.isnull().values==True])#可以去掉
结果输出:
结论:np.array格式与df格式对布尔型的索引的处理方式完全不同,np.array格式直接将true位置上的元素返回,并返回一个list类型;而df对每一个true索引都会返回一行,如果一行有多个true,则会将该行返回多次,最终返回一个dataframe,最终结果就容易出现很多完全重复的行;总的来讲,有多少个True就会返回多少行;本人推测df的机制就这样的:每一行的布尔索引会一个一个的去检查,如果出现true,返回该行,所以该行有多少个true就返回多少行;更深层次的推测,就是df其实是按一维索引来返回行的,df只判断是否返回行,所以当索引为二维时,其每一行索引的值都是用来判断是否返回该行;
print(df[[True,False,True,False,True]])#如果用df.a>某值,其返回的结果结构一样也是一个布尔型索引
#print(df[pd.Series([True,False,True,False,True])])等价于上面语句
其结果返回三行分别为: