2017-10-21 45 views
1

我有以下數據框中選擇一個子集:使用dropna()選擇多列

df = pd.DataFrame([[1,2,3,3],[10,20,2,],[10,2,5,],[1,3],[2]],columns = ['a','b','c','d']) 

從這個數據幀,我要刪除的行,其中在子集[「B」,「C的所有值','d']是NA,這意味着最後一行應該被刪除。

下面的代碼工作:

df.dropna(subset=['b', 'c', 'd'], how = 'all') 

然而,考慮到我將與較大的數據幀中的工作,我想選擇使用的範圍內「B」:「d」]相同的子集。我如何選擇這個子集?

+0

@ayhan是,類似的東西,但我意識到':'可能導致昂貴的拷貝:-) –

+2

@cᴏʟᴅsᴘᴇᴇᴅ是的,我一直在尋找到'columns.slice_locs'來避免這種情況,但是你的是一個很好的黑客。 :) – ayhan

回答

2

IIUC,使用loc,檢索這些列,並將其傳遞給dropna

c = df.loc[0, 'b':'d'].columns # retrieve only the 0th row for efficiency 
df = df.dropna(subset=c, how='all') 

print(df) 
    a  b c d 
0 1 2.0 3.0 3.0 
1 10 20.0 2.0 NaN 
2 10 2.0 5.0 NaN 
3 1 3.0 NaN NaN 
+0

這是一個有趣的黑客;-) – MaxU

2

類似@ayhan's idea - 使用df.columns.slice_indexer

In [25]: cols = df.columns[df.columns.slice_indexer('b','d')] 

In [26]: cols 
Out[26]: Index(['b', 'c', 'd'], dtype='object') 

In [27]: df.dropna(subset=cols, how='all') 
Out[27]: 
    a  b c d 
0 1 2.0 3.0 3.0 
1 10 20.0 2.0 NaN 
2 10 2.0 5.0 NaN 
3 1 3.0 NaN NaN 
+1

阿格,我今天沒票了,低調了所有可怕的問題。 >:(我會爲此撤銷一些! –

+1

@cᴏʟᴅsᴘᴇᴇᴅ,不要讓黑暗的力量控制你:-D – MaxU