2016-07-15 3 views
0

Ich habe einen Datensatz mit Float-Werten:Dumb Fehler in meiner if/und Aussage - sieht es nicht

dog-auto  dog-bird  dog-cat   dog-dog   Result 
41.9579761457 41.7538647304 36.4196077068 33.4773590373 0 
46.0021331807 41.33958925  38.8353268874 32.8458495684 0 
42.9462290692 38.6157590853 36.9763410854 35.0397073189 0 
41.6866060048 37.0892269954 34.575072914 33.9010327697 0 
39.2269664935 38.272288694 34.778824791 37.4849250909 0 
40.5845117698 39.1462089236 35.1171578292 34.945165344 0 
45.1067352961 40.523040106 40.6095830913 39.0957278345 0 
41.3221140974 38.1947918393 39.9036867306 37.7696131032 0 
41.8244654995 40.1567131661 38.0674700168 35.1089144603 0 
45.4976929401 45.5597962603 42.7258732951 43.2422832585 0 

Dies ist ein SFrame. Ich habe versucht, eine Funktion zu schreiben, die eine if/an-Anweisung verwendet, um zu bestimmen, ob der Wert für Hund-Hund kleiner ist als die Werte für Hund-Katze UND Hund-Auto UND Hund-Vogel.

Ich habe das für den besseren Teil von 4 Stunden durchgemacht. Zugegeben, ich bin ein Neuling für Python - ich mache einen Fehler und sehe es einfach nicht.

If-Anweisung:

def is_dog_correct(row): 
    if (dog_distances[dog_distances['dog-dog']] < dog_distances[dog_distances['dog-cat']]) & (dog_distances[dog_distances['dog-dog']] < dog_distances[dog_distances['dog-bird']]) & (dog_distances[dog_distances['dog-dog']] < dog_distances[dog_distances['dog-auto']]): 
     dog_distances['Result'] = 1 
    else: 
     dog_distances['Result'] = 0 

dann rufe ich die Funktion mit:

dog_distances.apply(is_dog_correct) 

Wenn dies richtig funktioniert, würde ich "0" in jeder Zeile, aber der fünften Datensatz sehen. Was ist falsch an meiner if-Anweisung?

Volle Enthüllung - das ist Kursarbeit, aber nachdem ich 4 Stunden damit verbracht habe, erreiche ich Hilfe!

+4

'&' ist eine bitweise Operation. Ändere alle deine '' '' '' '' ' – engineer14

+0

Was ist' dog-distances', dass es sowohl String- als auch (scheinbar) Gleitkomma-Schlüssel hat? Und warum benutzt du '&' anstelle von 'und'? – chepner

+2

Ihre Funktion nimmt ein 'row' Argument, aber verwendet es nie ... –

Antwort

1

Ändern & zu und wie von den vorherigen Kommentaren angegeben. Außerdem empfehle ich Ihnen, solche langen if-Anweisungen in mehrere Zeilen aufzuteilen, damit sie klarer und einfacher zu lesen sind.

def is_dog_correct(row): 
    if (dog_distances[dog_distances['dog-dog']] < dog_distances[dog_distances['dog-cat']]) and 
     (dog_distances[dog_distances['dog-dog']] < dog_distances[dog_distances['dog-bird']]) and 
     (dog_distances[dog_distances['dog-dog']] < dog_distances[dog_distances['dog-auto']]): 
     dog_distances['Result'] = 1 
    else: 
     dog_distances['Result'] = 0 
+0

Ok @Informat, änderte ich es auf den genauen Code oben gezeigt, aber scheint immer noch nicht durch die Bedingungen. Jetzt frage ich mich, ob dies eine boolesche Operation im Hintergrund tut (True/False) - mache ich einen Fehler, indem ich versuche, den Wert auf Result = 1 oder Result = 0 zu setzen? Danke für deine Gedanken! Ich schätze Ihre Hilfe! –

+0

Kann ich sehen, wie Sie dog_distances definiert und eingerichtet haben? – Informat

0

Machen Sie Ihre erste if-Anweisung mehr sauber durch die min (Minimum) zu finden, der alle Werte. Dies stellt sicher, dass 'Hund-Hund' ist kleiner als der ganze Rest:

def is_dog_correct(row): 
    if dog_distances[dog_distances['dog-dog']] < min([dog_distances[dog_distances['dog-'+x]] for x in ['cat','bird','auto']]): 
     dog_distances['Result'] = 0 
    else: 
     dog_distances['Result'] = 1 

EDIT: Für debuggin Zwecke der folgenden verwenden:

def is_dog_correct(row): 
    print 'dog is {}'.format(dog_distances[dog_distances['dog-dog']]) 
    print 'everyone else is {}'.format([dog_distances[dog_distances['dog-'+x]] for x in ['cat','bird','auto']]) 
    if dog_distances[dog_distances['dog-dog']] < min([dog_distances[dog_distances['dog-'+x]] for x in ['cat','bird','auto']]): 
     print 'Yay dog is faster' 
     dog_distances['Result'] = 0 
    else: 
     print 'Awww, dog is not faster' 
     dog_distances['Result'] = 1 
+0

Das ist interessant, aber ich muss feststellen, ob der Hund-Hund-Wert kleiner als jeder der Werte ist. Vielleicht wird Ihr Code bestimmen, welcher Wert das Minimum aller drei ist, und dann die Bedingung ausführen? Wenn das stimmt, dann würde vielleicht funktionieren - ich werde es versuchen und es euch wissen lassen. Vielen Dank dass Sie darüber nachdenken! –

+0

Ich poppte es ein, aber das Ergebnis war, dass alle Werte auf 1 gesetzt wurden (anstatt 0), aber die eine Zeile im HEAD-Teil, die oben 0 hätte sein sollen, zeigt immer noch 1 an. Also ... die Bedingungen noch nicht Erkennen, dass der Hund-Hund-Wert geringer ist als der Hund-Vogel-Wert in Zeile 6 (siehe oben). Danke für Ihre Aufmerksamkeit! –

+0

Gern geschehen. Sie sollten alle mit Ausnahme der letzten Reihe sein, denn 43.2 ist nicht weniger als 42,7. –