2016-05-30 117 views
0

我有一个熊猫DataFrame,我想选择某些值为True的行。从任意数量条件的熊猫DataFrame中选择行

df = DataFrame([[True, True, True], [True, False, True], [True, True, False]], index=['a', 'b', 'c'], columns=['val1', 'val2', 'other'])#, columns=['val1', 'other']) 

# example DataFrame: 

    val1 val2 other 
a True True True 
b True False True 
c True True False 

我想要哪些列的名称包含字符串'val'的列的值为True。在这个示例DataFrame的情况下,这意味着我关心列'val1'和'val2'中的值。如果我知道这两列的具体名称,这个选择很容易:

cond = df['val1'] & df['val2'] 
df[cond] 

# gives me: 

    val1 val2 other 
a True True True 
c True True False 

到目前为止这么好。但是,在我的实际使用情况中,我不知道会有多少'val'列,或者它们的确切名称是什么。

我知道如何让所有的“VAL”列:

df.columns[df.columns.str.contains('val')] 

# gives me: 

Index([u'val1', u'val2'], dtype='object') 

但我怎么把这些结合在一起?给定一个任意长度的列名称列表,如何使用布尔索引来获取那些列的值为True的行?

+0

你可以发表你的期望的结果集? – MaxU

回答

1

使用.all(axis=1)(见docs):

df[df.loc[:, df.columns.str.contains('val')].all(axis=1)] 

用于说明样品数据:

df = pd.DataFrame(data=np.random.choice([True, False], (5, 6)), columns=['val_{}'.format(i) for i in range(5)] + ['other']) 

    val_0 val_1 val_2 val_3 val_4 other 
0 True True True True True False 
1 False True True True False False 
2 False False True False True True 
3 True False False False True True 
4 False True True True False False 

df[df.loc[:, df.columns.str.contains('val')].all(1)] 

    val_0 val_1 val_2 val_3 val_4 other 
0 True True True True True False 
1

您可以使用filter()all()功能做到这一点:

In [194]: df[df.filter(like='val').all(axis=1)] 
Out[194]: 
    val1 val2 other 
a True True True 
c True True False