Кажется очень распространенным явлением для выбора определенного значения из столбца 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
колонка все еще там!
Я что-то упустил?
Это довольно хорошо. Он проходит тест «чувствует себя правильно», о котором я говорю в своем OP. – LondonRob