2017-09-15 6 views
2

Ich habe einen Datenrahmen mit Ländernamen & deren Prozentsatz der Energieabgabe. Ich muss eine neue Spalte hinzufügen, die eine 1 oder 0 zuweist, abhängig davon, ob der Energieoutput des Landes über oder unter dem Median der Energieabgabe liegt. Einige Dummy-Code ist:Pandas DataFrame - 1,0 Werte basierend auf anderen Spalte zuweisen

import pandas as pd 
def answer(): 
    df = pd.DataFrame({'name':['china', 'america', 'canada'], 'output': [33.2, 15.0, 5.0]}) 
    df['newcol'] = df.where(df['output'] > df['output'].median(), 1, 0) 
    return df['newcol'] 
answer() 

der Code gibt Valueerror: Falsche Anzahl von Artikel 2 geführt, Platzierung bedeutet 1

ich so das Gefühl ist eine unglaublich einfache Lösung, aber ich bin neu in der Arbeit mit Pandas. Bitte helfen Sie meine Frust zu beenden

Antwort

1

@Vaishali erklärt, warum pd.DataFrame.where nicht wie erwartet funktioniert hat und schlug vor, stattdessen np.where zu verwenden, was ein sehr guter Rat ist.

Ich biete an, dass Sie Ihr boolesches Ergebnis einfach in ganze Zahlen umgewandelt haben könnten.

Einrichtung

df = pd.DataFrame({ 
    'name':['china', 'america', 'canada'], 
    'output': [33.2, 15.0, 5.0] 
}) 

Option 1

df['newcol'] = (df['output'] > df['output'].median()).astype(int) 

Option 2
oder schneller noch durch die darunter liegende numpy

Arrays 01 unter Verwendung von
+0

Hmmm, es gibt immer - warum habe ich nicht daran gedacht :) – Vaishali

+0

vielen Dank! Ich hatte boolesche Maskierung versucht, aber ich hatte Mühe, die zurückgegebenen True | False-Werte neu zu formatieren. Ich bin den Pandas sehr neu und es fällt mir schwer, die gesamte Dokumentation zu lernen. du und @Vaishali waren sehr informativ :) –

2

Sie brauchen keine Schleife, wie die Lösung vektorisiert wird.

df['newcol'] = np.where((df['output'] > df['output'].median()), 1, 0) 

    name output newcol 
0 china 33.2 1 
1 america 15.0 0 
2 canada 5.0  0 

Für den Fehler falsche Anzahl der Elemente übergeben, df.where funktioniert ein wenig anders als np.where. It Gibt ein Objekt mit der gleichen Form wie self zurück, dessen entsprechende Einträge von self stammen, wobei cond True ist und andernfalls von anderen. Also gibt es einen Datenrahmen in Ihrem Fall mit zwei Spalten anstelle einer Serie zurück und wenn Sie versuchen, diesen Datenrahmen einer Serie zuzuordnen, erhalten Sie die Fehlermeldung.

+0

Ich habe mich gefragt, warum andere Beiträge np.where! Im Wesentlichen habe ich also das gesamte df in meine neue Serie übernommen und deshalb einen Fehler gemacht? –

+0

np.where ist definitiv sehr nützlich in if-else Art eines Szenarios, wenn Sie die Ausgabe zu einem anderen Datentyp als boolean benötigen. Selbst für Boolean funktioniert es, aber nur die boolesche Maskierung ist besser. Und ja, Sie haben ein df in die neue Serie und damit den Fehler übergeben. Sie können sehen, was passiert, indem Sie einfach df.where drucken (df ['output']> df ['output']. Median(), 1, 0) – Vaishali

Verwandte Themen