2017-07-27 772 views
2

我试图运行我认为简单的代码来消除所有NaN中的任何列,但无法使其正常工作(axis = 1在删除行时工作正常) :熊猫:IndexingError:不可对齐的布尔系列作为索引器提供

import pandas as pd 
import numpy as np 

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

df = df[df.notnull().any(axis = 0)] 

print df 

完整的错误:

raise IndexingError('Unalignable boolean Series provided as 'pandas.core.indexing.IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match

预期输出:

 a b c 
0 1.0 4.0 NaN 
1 2.0 NaN 8.0 
2 NaN 6.0 9.0 
3 NaN NaN NaN 

回答

3

你需要loc,因为按列过滤:

print (df.notnull().any(axis = 0)) 
a  True 
b  True 
c  True 
d False 
dtype: bool 

df = df.loc[:, df.notnull().any(axis = 0)] 
print (df) 

    a b c 
0 1.0 4.0 NaN 
1 2.0 NaN 8.0 
2 NaN 6.0 9.0 
3 NaN NaN NaN 

或过滤列,然后通过[]选择:

print (df.columns[df.notnull().any(axis = 0)]) 
Index(['a', 'b', 'c'], dtype='object') 

df = df[df.columns[df.notnull().any(axis = 0)]] 
print (df) 

    a b c 
0 1.0 4.0 NaN 
1 2.0 NaN 8.0 
2 NaN 6.0 9.0 
3 NaN NaN NaN 

或者dropna与参数how='all'测试remove仅NaN房间里摆满所有列:

print (df.dropna(axis=1, how='all')) 
    a b c 
0 1.0 4.0 NaN 
1 2.0 NaN 8.0 
2 NaN 6.0 9.0 
3 NaN NaN NaN 
+0

Ahhhh,因为'df []'方法正在寻找一个基于行的索引,而不是一个基于列的索引。收到了。谢谢。 – pshep123

+0

@ pshep123 - 很高兴能帮到你! – jezrael

2

您可以使用dropnaaxis=1thresh=1

In[19]: 
df.dropna(axis=1, thresh=1) 

Out[19]: 
    a b c 
0 1.0 4.0 NaN 
1 2.0 NaN 8.0 
2 NaN 6.0 9.0 
3 NaN NaN NaN 

这将下降不具有至少1个非楠值的任何列,这将意味着所有NaN任何列就会被放弃

你尝试过什么原因失败的原因是因为布尔面膜:

In[20]: 
df.notnull().any(axis = 0) 

Out[20]: 
a  True 
b  True 
c  True 
d False 
dtype: bool 

不能上这就是默认情况下使用,因为这会产生在列的布尔面具指数对准

+1

谢谢埃德 - 我不知道'thresh'参数。刚刚得知您可以同时使用两个轴来修剪所有空行和列:'df = df.dropna(axis = [0,1],how ='all')' – pshep123

+0

是的,它是非常灵活和有用的方法 – EdChum