2016-05-21 119 views
4

我正在嘗試打印或獲取缺少值的列名稱列表。例如。熊貓:打印列名缺失值

data1 data2 data3 
1  3  3 
2  NaN 5 
3  4  NaN 

我想要['data2','data3']。 我寫了下面的代碼:

print('\n'.join(map(
    lambda x : str(x[1]) 
    ,(filter(lambda z: z[0] != False, zip(train.isnull().any(axis=0), train.columns.values))) 
))) 

它運作良好,但我認爲應該是簡單的方法。

+0

謝謝大家的答案。他們都工作,但我決定檢查執行時間。我有以下值: [COL的山坳中df.columns如果DF [COL] .isnull()任何()。] 經過時間:0:00:00.391752 df.columns [df.isnull() .ANY()] 經過時間:0:00:00.396459 df.loc [:, df.isnull()任何()] 經過的時間:0:00:00.430103 我決定第二使用變種,因爲它既短又快。 – LinearLeopard

回答

17

df.isnull().any()產生一個布爾陣列(True如果列具有缺失值,否則返回False)。您可以使用它索引到df.columns

df.columns[df.isnull().any()] 

將返回缺少值列的列表。


df = pd.DataFrame({'A': [1, 2, 3], 
        'B': [1, 2, np.nan], 
        'C': [4, 5, 6], 
        'D': [np.nan, np.nan, np.nan]}) 

df 
Out: 
    A B C D 
0 1 1.0 4 NaN 
1 2 2.0 5 NaN 
2 3 NaN 6 NaN 

df.columns[df.isnull().any()] 
Out: Index(['B', 'D'], dtype='object') 

df.columns[df.isnull().any()].tolist() # to get a list instead of an Index object 
Out: ['B', 'D'] 
5

Oneliner -

[col for col in df.columns if df[col].isnull().any()] 
2

另一種選擇:

df.loc[:, df.isnull().any()]