使用dropna()选择子集以选择多个列

时间:2017-10-21 15:15:01

标签: python pandas

我有以下DataFrame:

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

从这个DataFrame中,我想删除子集['b','c','d']中的所有值都是NA的行,这意味着应删除最后一行。

以下代码有效:

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

然而,考虑到我将使用更大的数据帧,我想使用范围['b':'d']选择相同的子集。如何选择此子集?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

@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

答案 2 :(得分:0)

您还可以按数字方式对列列表进行切片:

c = df.columns[1:4]  
df = df.dropna(subset=c, how='all')

如果使用数字不切实际(即无法计数),则存在一些麻烦的解决方法:

start, stop = df.columns.get_loc('b'), df.columns.get_loc('d')
c = df.columns[start:stop+1]
df = df.dropna(subset=c, how='all')