2013-06-20 29 views
8

Trong Pandas, làm cách nào tôi có thể nhận danh sách các chỉ mục của chuỗi/khung dữ liệu cho các mục đáp ứng một số thuộc tính?Nhận chỉ mục đáp ứng một số tiêu chí

Lợi nhuận sau một đối tượng Series

my_dataframe.loc[:,'some_column'] == 'some_value' 

trông như thế này:

519  True 
509 False 
826 False 
503 False 
511 False 
512 False 
500 False 
507 False 
516  True 
504 False 
521 False 
510 False 
351 False 
522 False 
526 False 
517 False 
501 False 

nhưng những gì tôi muốn là hai danh sách, một với

[519, 516] 

và một với phần còn lại của các chỉ số. Làm thế nào tôi có thể làm điều này trong Pandas?

+0

itertools.filter (lambda x: x [1], (my_dataframe.loc [:, 'somecolumn'] == 'some_value')) – lucasg

Trả lời

10
In [8]: df = DataFrame(randn(10,2),columns=list('AB')) 

In [9]: df 
Out[9]: 
      A   B 
0 -1.046978 1.561624 
1 -0.264645 0.717171 
2 0.112354 -2.084449 
3 -1.243482 -1.183749 
4 1.055667 0.532444 
5 -1.295805 2.168225 
6 -1.239725 0.969934 
7 -0.354017 1.434943 
8 -0.867560 0.810315 
9 0.097698 -0.033039 

In [10]: df.loc[:,'B'] > 0 
Out[10]: 
0  True 
1  True 
2 False 
3 False 
4  True 
5  True 
6  True 
7  True 
8  True 
9 False 
Name: B, dtype: bool 

In [14]: x = df.loc[:,'B'] > 0 

Per Tom/Andy, much simpler 

In [33]: x[x].index 
Out[33]: Int64Index([0, 1, 4, 5, 6, 7, 8], dtype=int64) 

In [34]: x[~x].index 
Out[34]: Int64Index([2, 3, 9], dtype=int64) 
+0

Heh, bạn đã chỉnh sửa sau khi tôi đăng. Bất kỳ lý do bạn đang sử dụng '.nonzero()' thay vì một lát boolean trên chỉ mục? – TomAugspurger

+0

... hoặc 'x [~ x]' :) –

+0

điều đầu tiên đến với tâm trí .... wll thay đổi ... các bạn là đúng – Jeff

3

Một biến thể nhẹ trên @ dụ của Jeff:

In [18]: df 
Out[18]: 
      A   B 
0 0.319489 1.
1 0.494205 -0.918240 
2 1.501922 -0.409661 
3 -1.593702 0.705407 
4 -0.735312 1.037567 
5 -0.201132 -0.673124 
6 1.237310 -0.877043 
7 -0.946714 0.984164 
8 -0.923548 0.415094 
9 0.135281 -0.199951 

In [14] list1 = df.index[df.loc[:, 'B'] > 0] 

In [15]: list1 
Out[15]: Int64Index([0, 3, 4, 7, 8], dtype=int64) 

In [16]: list2 = df.index - list1 

In [17]: list2 
Out[17]: Int64Index([1, 2, 5, 6, 9], dtype=int64) 
+0

Làm thế nào để bạn nhận được 'list1'? Tất cả những gì tôi có là 'my_dataframe.loc [:, 'some_column'] == 'some_value'' như trong OP. Cảm ơn, –

+1

@ user815423426 doh xin lỗi. Đã bỏ lỡ khi sao chép. Đã sửa lỗi. Bạn vẫn làm == some_value, phần quan trọng là chỉ số của nó mà bạn đang cắt. – TomAugspurger

Các vấn đề liên quan