2015-07-29 3 views
1

Кажется очень распространенным явлением для выбора определенного значения из столбца DataFrame, который оставляет этот столбец избыточным. Я всегда сразу бросаю столбец сразу после.Выделить по столбцу и столбцу столбца

Это особенно заметно с булевыми столбцами:

In [58]: countries = ['X', 'Y', 'Z']; sectors = ['A', 'B', 'C'] 
In [59]: ch = np.random.choice 
In [61]: df = pd.DataFrame(dict(c=ch(countries, 100), s1=ch(sectors, 100), s2=ch(sectors, 100), is_good=ch([True, False], 100), val1=np.random.random(100), val2=np.random.random(100))) 
In [62]: df.head() 
Out[62]: 
    c is_good s1 s2  val1  val2 
0 Z True B B 0.694949 0.145197 
1 X True A A 0.319551 0.548003 
2 X False A C 0.946967 0.220035 
3 X False B A 0.998087 0.902530 
4 Y False B C 0.303517 0.660556 

теперь я хочу работать только с good значениями, так что я:

In [30]: df[df.is_good].drop('is_good', axis=1).head() 
Out[30]: 
    c s1 s2  val1  val2 
0 Y B C 0.265542 0.410853 
2 Z C C 0.216049 0.407230 
4 Z B C 0.209100 0.856136 
5 X B B 0.351570 0.461769 
7 X A B 0.516026 0.209944 

Но это своего рода чувство, что должно быть способ сделать это, что не предполагает явно отказаться от is_good. Вы можете сделать:

In [31]: df.set_index('is_good').ix[True].head() 
Out[31]: 
     c s1 s2  val1  val2 
is_good        
True  Y B C 0.265542 0.410853 
True  Z C C 0.216049 0.407230 
True  Z B C 0.209100 0.856136 
True  X B B 0.351570 0.461769 
True  X A B 0.516026 0.209944 

, которому мне очень нравится ощущение, но тогда индекс испорчен.

Я также был соблазн сделать:

In [42]: df.groupby('is_good').get_group(True).head() 
Out[42]: 
    c is_good s1 s2  val1  val2 
0 Y True B C 0.265542 0.410853 
2 Z True C C 0.216049 0.407230 
4 Z True B C 0.209100 0.856136 
5 X True B B 0.351570 0.461769 
7 X True A B 0.516026 0.209944 

но is_good колонка все еще там!

Я что-то упустил?

ответ

2

Это один из способов. Идея состоит в том, чтобы построить многоуровневый индекс и использовать .xs, чтобы выбрать, автоматически упадет на один уровень.

df.set_index('is_good', append=True).xs(True, level='is_good') 

    c s1 s2 val1 val2 
0 Z A B 0.1352 0.9529 
3 X A A 0.5531 0.5571 
8 Y B C 0.7401 0.0288 
12 Y B B 0.4117 0.3606 
16 X C A 0.7138 0.7112 
18 Y C C 0.6342 0.3654 
26 Y C A 0.9927 0.9493 
28 Z C B 0.6059 0.5674 
.. .. .. ..  ...  ... 
80 Z B A 0.2772 0.1103 
83 Y C B 0.6060 0.7179 
85 Z B B 0.2914 0.3398 
86 X A B 0.4753 0.0029 
91 Y B A 0.9477 0.5383 
92 X B B 0.9784 0.9479 
95 Y A C 0.1813 0.9646 
96 Y B B 0.8365 0.2424 

[45 rows x 5 columns] 
+0

Это довольно хорошо. Он проходит тест «чувствует себя правильно», о котором я говорю в своем OP. – LondonRob

Смежные вопросы