2014-10-01 57 views
0

我有一个熊猫DataFrame与许多列和概率索引。下面的代码可以生成DF有条件地抓取熊猫数据框中的列标题

import numpy as N 
probs = N.arange(0, 1, .1) 
data = N.random.random_integers(0, 500, (10,3)) 
df = DataFrame(data, index=probs, columns=['col1', 'col2', 'col3']) 

我要抢列标题,其中的细胞计数高于特定的概率某个阈值的样本。例如,如果我在乎的概率> = 75,并在100以上的单元格的值我可以做以下

df[df['Probability'] >= .75] >= 100 

但基于该索引,如何获取列标题,其中至少一个条目是真的? (即'col1'至少有一个值的概率高于.75并且大于100,并不一定都是这些值)

回答

2

您可以将布尔向量传递给列轴.loc。例如,如果你想在那里的所有值都高于100列,你的面具是:

In [111]: mask = (df[df.index > .75] >= 100).any() 

然后,你可以通过这个来.loc进行过滤。

In [112]: df.loc[:, mask] 
Out[112]: 
    col1 col2 col3 
0.0 358 30 241 
0.1 330 71 119 
0.2 311 92 204 
0.3 347 245 344 
0.4 214 219 347 
0.5 152 241 65 
0.6 232 487 61 
0.7 478 314 196 
0.8 477 317 291 
0.9 303 99 342 

如果您只是想要列标题,您可以将掩码应用于自身。

In [119]: mask[mask].index 
Out[119]: Index([u'col1', u'col2', u'col3'], dtype='object') 
+0

这不完全给我我正在寻找的行为。我希望所有列的最小值在100以上,而不一定是全部。我编辑了我的问题,以使其更清晰 – sedavidw 2014-10-01 17:35:14

+0

@sedavidw - 将'all()'更改为'any()'(我也编辑了答案)。我使用'all'只是为了展示这种技术,因为在这种情况下'any'实际上并不过滤任何东西。 – chrisb 2014-10-01 17:40:03

+0

谢谢!太棒了 – sedavidw 2014-10-01 18:45:46

相关问题