2016-07-09 4 views
3

Ich bin ziemlich neu in Python und dieser Gemeinschaft, also bitte verzeih mir meine amateurhaften Versuche, meine tiefe Verwirrung auf etwas zu erklären, das höchstwahrscheinlich sehr offensichtlich ist. Wie auch immer ..Using any() und all() auf MultiIndex DataFrame beim Schneiden über .xs: seltsames Verhalten oder nur ich?

Ich habe einen Datenrahmen namens "Daten". Es ist MultiIndexed mit 2 Ebenen bestehend aus: "Datum" und "Fürze".

Es gibt eine einzelne Spalte namens: "integrated_daily_difference".

Sie übernehmen können „Fürze“ ist vom Typ: ‚pandas.core.index.Index‘ und wurde über erstellt: farts = data.index.levels[1]

lässt sich nun vor, würde ich an einer beliebigen ein Stück Sicht auf meine Datenrahmen nehmen möchten Indexwert in furzt: dh Fürze [1]

Me:

data.xs(farts[1], level = 1) 

Computer:

    integrated_daily_difference 
     date  
2015-05-21 00:00:00+00:00 0.000000 
2015-05-22 00:00:00+00:00 0.000000 
2015-05-26 00:00:00+00:00 -0.024497 
2015-05-27 00:00:00+00:00 -0.051144 
2015-05-28 00:00:00+00:00 -0.079841 
2015-05-29 00:00:00+00:00 -0.106666 
2015-06-01 00:00:00+00:00 -0.131245 
2015-06-02 00:00:00+00:00 -0.157428 
2015-06-03 00:00:00+00:00 -0.184057 
2015-06-04 00:00:00+00:00 -0.209755 
2015-06-05 00:00:00+00:00 -0.234588 
2015-06-08 00:00:00+00:00 -0.262365 
2015-06-09 00:00:00+00:00 -0.291890 
2015-06-10 00:00:00+00:00 -0.320943 
2015-06-11 00:00:00+00:00 -0.352627 
2015-06-12 00:00:00+00:00 -0.381425 
2015-06-15 00:00:00+00:00 -0.404055 
Me

:

data.xs(farts[1], level = 1) < 0 

Computer:

   integrated_daily_difference 
     date 
2015-05-21 00:00:00+00:00 False 
2015-05-22 00:00:00+00:00 False 
2015-05-26 00:00:00+00:00 True 
2015-05-27 00:00:00+00:00 True 
2015-05-28 00:00:00+00:00 True 
2015-05-29 00:00:00+00:00 True 
2015-06-01 00:00:00+00:00 True 
2015-06-02 00:00:00+00:00 True 
2015-06-03 00:00:00+00:00 True 
2015-06-04 00:00:00+00:00 True 
2015-06-05 00:00:00+00:00 True 
2015-06-08 00:00:00+00:00 True 
2015-06-09 00:00:00+00:00 True 
2015-06-10 00:00:00+00:00 True 
2015-06-11 00:00:00+00:00 True 
2015-06-12 00:00:00+00:00 True 
2015-06-15 00:00:00+00:00 True 

Ich nehme an, dies zurückgibt, ob ein Wert für jeden Ort innerhalb meiner geschnitten Datenrahmen existiert, so ist das Ergebnis wahr ist?

Me:

data.xs(farts[1], level = 1).any() 

Computer:

integrated_daily_difference True 
dtype: bool 

OK, das alle Art Sinn macht. Jetzt für die weird stuff ..

Me:

data.xs(farts[1], level = 1).any() < 0 

Computer:

integrated_daily_difference False 
dtype: bool 

Huh ....?

Me:

data.xs(farts[1], level = 1).any(axis = 0) < 0 

Computer:

integrated_daily_difference False 
dtype: bool 

Me:

data.xs(farts[1], level = 1).any(axis = 1) < 0 

Computer:

 date 
2015-05-21 00:00:00+00:00 False 
2015-05-22 00:00:00+00:00 False 
2015-05-26 00:00:00+00:00 False 
2015-05-27 00:00:00+00:00 False 
2015-05-28 00:00:00+00:00 False 
2015-05-29 00:00:00+00:00 False 
2015-06-01 00:00:00+00:00 False 
2015-06-02 00:00:00+00:00 False 
2015-06-03 00:00:00+00:00 False 
2015-06-04 00:00:00+00:00 False 
2015-06-05 00:00:00+00:00 False 
2015-06-08 00:00:00+00:00 False 
2015-06-09 00:00:00+00:00 False 
2015-06-10 00:00:00+00:00 False 
2015-06-11 00:00:00+00:00 False 
2015-06-12 00:00:00+00:00 False 
2015-06-15 00:00:00+00:00 False 

Me:

data.xs(farts[1], level = 1).any(axis = 1) <= 0 

Computer:

 date 
2015-05-21 00:00:00+00:00  True 
2015-05-22 00:00:00+00:00  True 
2015-05-26 00:00:00+00:00 False 
2015-05-27 00:00:00+00:00 False 
2015-05-28 00:00:00+00:00 False 
2015-05-29 00:00:00+00:00 False 
2015-06-01 00:00:00+00:00 False 
2015-06-02 00:00:00+00:00 False 
2015-06-03 00:00:00+00:00 False 
2015-06-04 00:00:00+00:00 False 
2015-06-05 00:00:00+00:00 False 
2015-06-08 00:00:00+00:00 False 
2015-06-09 00:00:00+00:00 False 
2015-06-10 00:00:00+00:00 False 
2015-06-11 00:00:00+00:00 False 
2015-06-12 00:00:00+00:00 False 
2015-06-15 00:00:00+00:00 False 

Me:

data.xs(farts[1], level = 1).any(axis = 0) <= 0 

Computer:

integrated_daily_difference False 
dtype: bool 

Dann begann mein Computer lachen maniacally bei mir und meinem Kopf explodiert ...

Aber im Ernst, was ist hier los? Mein Ziel war es, nur zu versuchen, zu überprüfen, ob alle oder irgendwelche Werte in meinem Einzelspalten-Datenrahmen eine Bedingung erfüllen und ein boolesches Wahr oder Falsch zurückgeben. Ich benutze keine() korrekt, also suche ich Hilfe.

Jede Eingabe wird geschätzt. Vielen Dank im Voraus!

Antwort

2

Lassen Sie mich zuerst definieren, was jedes Mittel entsprechend der Dokumentation von pandas-

zurück, ob ein Element Wahr ist über Achse angefordert

Nun, wenn Sie schreiben -

data.xs(farts[1], level = 1).any() 

Es prüft nur, ob einer der Werte truthy ist oder nicht aber, da es keine Bedingung gi gibt Es werden nur die Zahlen überprüft, was bedeutet, dass 0 als Falsch und jede andere Zahl als Wahr genommen wird. Jetzt als gibt es Zahlen andere als 0, es gibt True zurück.

Nun überprüfen Sie -

data.xs(farts[1], level = 1).any() < 0 

But True 1 und Falsch ist 0, wenn sie als ganze Zahlen dargestellt, so dass es False zurückgibt, wie die Ausgabe an data.xs(farts[1], level = 1).any() Wahr ist, das ist 1. Wenn Sie also überprüfen werde

data.xs(farts[1], level = 1).any() == 1 

wird True zurückgegeben.

können nun sehen, was passiert, wenn Sie tun -

data.xs(farts[1], level = 1).any(axis = 1) <= 0 

Zuerst die Achse geändert haben, jetzt data.xs(farts[1], level = 1).any(axis = 1) kehrt nur Trues und Falschen gemäß den Werten (True/1 für andere Werte als 0 und Falsch/0 für Werte, die 0 sind). Jetzt, wie die ersten beiden Werte sind 0s/False und es erfüllt die Bedingung "< = 0" Es gibt Ihnen die Ausgabe, die Sie sehen. Versuchen Sie es -

data.xs(farts[1], level = 1).any(axis = 1) == 1 

und Sie erhalten die genau entgegengesetzte Ausgabe.

Im Gegensatz zu jedem() funktioniert all() anders ... Es gibt wahr zurück, wenn alle wahr sind oder alle falsch sind, andernfalls gibt es nur False zurück.

Und erwähne nur -

any und or OR all und and sind nicht das gleiche, wenn Sie vielleicht denken .... oder und und sind bitweise Operationen und sie folgen short circuit evaluation aber jede und alle Funktionen werden sie durch alle Bedingungen gehen.

Hoffe, es hilft :)

+0

Dies ist sehr hilfreich. Vielen Dank! Ich ging tatsächlich ein wenig tiefer und versuchte folgendes: mylist = [1,2,3,4,0, -1] print 'test 1:', alle (meine liste)> -1 print 'test 2:', alles (i> -1 für i in meiner Liste) Test 1 gedruckt True und Test 2 gedruckt False. Ich nehme an, dies ist aufgrund von True (1) und False (0) beide für den ersten Fall> -1, und wenn es in einem Generator ausgewertet wird verhält es sich anders .. –

+0

Lassen Sie Ihren ersten Versuch zu brechen, 'all (meine Liste) 'wieder gibt es keine Bedingung, aber da die Liste eine 0 enthält, gibt es False zurück, das numerisch 0 ist, das heißt, wenn Sie es mit"> -1 "testen, gibt es True zurück. – hashcode55

+0

und in der zweiten testen Sie auf einer Liste von booleans! i> -1 wird False für -1 zurückgeben, was zu False führt, try> = -1 und Sie erhalten True! Es ist nur das Basis-Konzept, das Sie im Auge behalten müssen ..... "True zurückgeben, wenn ein Element des iterable wahr ist." - für alle und "Return True, wenn alle Elemente des iterable sind wahr" - für alle – hashcode55

3

diese einfache Serie vor:

import numpy as np 
np.random.seed(0) 
ser = pd.Series(np.random.randint(0, 3, 10)) 

ser 
Out[78]: 
0 0 
1 1 
2 0 
3 1 
4 1 
5 2 
6 0 
7 2 
8 0 
9 0 
dtype: int32 

Angenommen, Sie haben den Vergleich ser < 2 tun wollen, wird es eine boolean-Array zurück:

ser < 2 
Out[79]: 
0  True 
1  True 
2  True 
3  True 
4  True 
5 False 
6  True 
7 False 
8  True 
9  True 
dtype: bool 

Jetzt Wenn Sie überprüfen möchten, ob einer von ihnen kleiner als 2 ist, müssen Sie any für dieses Array aufrufen.

(ser < 2).any() 
Out[81]: True 

Dies wird True zurück, wenn mindestens einer der Werte in ser < 2 Array True ist. .all() ist ähnlich:

(ser < 2).all() 
Out[82]: False 

Da nicht alle von ihnen sind wahr, es gibt False zurück. Wenn Sie ändern es:

(ser < 3).all() 
Out[83]: True 

Weil es die (ser < 3) Array und alle Elemente in diesem Array überprüft sind True.

Jetzt ist ser.any() lassen versuchen:

ser.any() 
Out[84]: True 

Hier Sie überprüfen, ob einer der Werte in der ursprünglichen Array True ist (Wenn 0 True ist, wenn 1 wahr usw.). Die Werte in diesem Array sind Ganzzahlen, keine booleschen Werte. Sie werden als True ausgewertet, wenn sie nicht gleich 0 sind. Da Sie also mindestens eine Nicht-Null in diesem Array haben, wird True zurückgegeben.

Nun, wenn ich ser.any() < 0 überprüfen wird es False zurück:

ser.any() < 0 
Out[85]: False 

Es ist, weil dieser Ausdruck ergibt True < 0:

True < 0 
Out[86]: False 

Es ist False weil True nicht kleiner als 0 ist, was Sie tun, ist ähnlich:

data.xs(farts[1], level = 1).any() < 0 

Es führt zuerst any() für diesen Abschnitt aus und gibt True zurück, da dieser Abschnitt Elemente ungleich Null aufweist. Wenn Sie tatsächlich überprüfen möchten, ob einer von ihnen ist kleiner als 0 ist, sollten Sie Folgendes eingeben:

(data.xs(farts[1], level = 1) < 0).any() 

(data.xs(farts[1], level = 1) < 0) eine boolean-Array erstellen und wenn alle Elemente in diesem Array True ist, wird .any()True zurückkehren und .

+0

Danke für die Antwort. sehr hilfreich :) –

Verwandte Themen