2017-10-14 1 views
0

Haftungsausschluss: Mein Code ist sehr amateurhaft, da ich noch Kursarbeitstätigkeiten durchführe. Bitte tragen Sie mit mir, wenn mein Code ineffizient oder von schlechter Qualität ist.Rationalisierung des Anfügens einer booleschen Spalte im Pandas-Datenrahmen

Ich habe die Macht der Pandas in einem aktuellen Python-Tutorial gelernt und habe dies auf einige meiner Kursarbeit angewendet. Wir haben gelernt, boolesche Filterung auf Pandas anzuwenden, also habe ich beschlossen, einen Schritt weiter zu gehen und zu versuchen, boolesche Werte an eine Spalte in meinen Daten anzufügen (Effizienz).

Der Tutor hat gesagt, wir sollten uns auf die Minimierung von Code konzentrieren, so viel wie wir können - Ich habe versucht, dies für die untere Effizienz Spalte zu tun. Der Grundlinieneffizienzwert beträgt 0,4805 (48,05%). Wenn die Werte darüber liegen, ist es akzeptabel. Wenn es darunter liegt, ist es ein "Fail".

Ich habe diese auf meinen Datenrahmen angehängt den Code unten verwenden:

df['Classification'] = (df[['Efficiency_%']].sum(axis=1) > 0.4805) 
df['Classification'] = (df['Classification'] == True).astype(int) 

Während dies nur zwei Zeilen Code ist - ist es eine Möglichkeit, diese weiter in einer einzigen Zeile zu rationalisieren?

Ich hatte überlegt, eine Lambda-Funktion zu verwenden, in die ich gerade lese. Ich bin interessiert, wenn es andere Alternativen gibt, die ich berücksichtigen könnte.

Meine Ansätze habe ich versucht haben:

  1. For-Schleifen - es ineffizient denen abgeraten wird dies aufgrund verwenden.
  2. If-Anweisungen - Ich konnte das nicht zum Laufen bringen, da ich keine '1' oder '0' an die Spalte df ['Classification'] anhängen kann, da es sich um einen Datenrahmen und nicht um eine Serie handelt.

    if i > 0.4805: 
    df['Classification'].append('0') else: 
    df['Classification'].append('1')if test 
    

Danke.

Antwort

1

Dies sollte das gleiche tun; Es ist nicht notwendig, ein Ein-Spalten-Datenbild Zeile für Zeile zu summieren, df[['Efficiency_%']].sum(axis=1) ist das Gleiche wie df['Efficiency_%'] und auch Boolesche Reihe == Wahr ist nicht notwendig, da es das gleiche Ergebnis liefert wie die Boolesche Reihe selbst.

df['Classification'] = (df['Efficiency_%'] > 0.4805).astype(int) 
+0

Vielen Dank! Das ist viel einfacher als ich dachte. Wenn es Ihnen nichts ausmacht - würden Sie in der Lage sein, den 'IF'-Statement-Teil meiner Frage zu erläutern? Ist es tatsächlich möglich, Werte über den IF-Ansatz an einen Datenrahmen anzuhängen? – azurekirby

+1

Sie können keinen Skalarwert an eine Serie anhängen. Wenn Sie den For-Schleifen-Ansatz verwenden möchten, erstellen Sie eine Liste, fügen Sie '0' und' 1' der Liste hinzu und weisen Sie dann die Liste dem Datenrahmen als Spalte zu : Etwas wie 'lst = []; für i in df ['Effizienz_%']: wenn i> 0,4805: lst.append (1) else: lst.append (0); df ['Klassifikation'] = lst'. – Psidom

+1

Vielen Dank Psidom! Ich werde dies in meinen Notizen niederschreiben, da dies ein sehr nützlicher Ansatz ist. – azurekirby

Verwandte Themen