2013-06-20 17 views
8

Wie kann ich in Pandas eine Liste von Indizes einer Reihe/eines Datenrahmens für die Einträge erhalten, die eine Eigenschaft erfüllen?Erhalten Sie Indizes, die einige Kriterien erfüllen

Der folgende Code gibt ein Series Objekt

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

die wie folgt aussieht:

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 

aber was ich will, ist zwei Listen, eine mit

[519, 516] 

und eine mit der Rest der Indizes. Wie kann ich das in Pandas machen?

+0

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

Antwort

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, du hast das editiert nachdem ich gepostet habe. Gibt es irgendeinen Grund, warum Sie '.nonzero()' anstelle eines booleschen Slices im Index verwenden? – TomAugspurger

+0

... oder 'x [~ x]' :) –

+0

erste Sache, die in den Sinn kam .... wll ändern ... Sie haben Recht – Jeff

3

Eine leichte Variante @ Jeffs Beispiel:

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

Wie bekommen Sie 'list1'? Alles, was ich habe, ist 'my_dataframe.loc [:, 'some_column'] == 'some_value' wie im OP. Danke, –

+1

@ user815423426 doh Entschuldigung. Verpasste das beim Kopieren einfügen. Jetzt behoben. Sie tun immer noch == some_value, der wichtige Teil ist, dass es der Index ist, in den Sie schneiden. – TomAugspurger

Verwandte Themen