2016-11-08 4 views
0

Ich habe einen Datenrahmen, der mehrere Gleichungen basierend auf bestimmten Kriterien erfordert. Ich muss die ersten drei Buchstaben eines Bezeichners nehmen, dann, wenn es wahr ist, muss ich den Wert, der mit dieser Zeile verbunden ist, durch einen bestimmten Betrag teilen.Ich muss mehrere Gleichungen auf einer Pandasäule basierend auf bestimmten Kriterien anwenden

Der Datenrahmen ist wie folgt:

ID  Value 
US123 10000 
US121 10000 
MX122 10000 
MX125 10000 
BR123 10000 
BR127 10000 

Ich brauche den Wert mit 100 zu unterteilen, wenn die ID mit ‚MX‘ beginnt, und unterteilen den Wert um 1000, wenn die ID mit ‚BR‘ beginnt. Alle anderen Werte müssen gleich bleiben.
Ich möchte auch keinen neuen gefilterten Datenrahmen erstellen. Ich habe erfolgreich nach ID gefiltert und dann die Logik überprüft, aber ich muss es über einen viel größeren Rahmen anwenden.

Dies ist der Code, den ich für den gefilterten Frame verwende.

filtered['Value'] = np.where(filtered.ID.apply(lambda x: x[:3]).isin(['MX']) == True, filtered.Value/100, filtered.Value/1000) 

ich auch df.loc habe versucht, aber ich kann nicht herausfinden, wie die Änderungen an den Datenrahmen anzuwenden, so scheint es mir nur eine Reihe von Daten zu zeigen, aber es nicht auf die DF gilt.

Dieser Code ist hier:

df.loc[(df['ID'].str.contains("MX") == True), 'Value']/100 
df.loc[(df['ID'].str.contains("BR") == True), 'Value']/1000 

Gibt es einen besseren Weg, dies zu tun? Wie kann ich die Änderungen mithilfe von df.loc auf den Hauptdatenrahmen anwenden, anstatt ihn in einer Serie anzuzeigen?

sollte der gewünschte Ausgang sein:

ID  Value 
US123 10000 
US121 10000 
MX122 100 
MX125 100 
BR123 10 
BR127 10 

Dank!

Antwort

1

Nach der Berechnung der unterteilten Werte unter Verwendung von .loc muss sie erneut an die DF zugewiesen werden, die für die Auswahl verwendet wurde, da die Operation nicht von selbst erfolgt.

Verwenden Sie str.startswith, um nach einer Zeichenfolge zu suchen, die mit einem bestimmten Muster beginnt.

df.loc[df['ID'].str.startswith('MX'), 'Value'] /= 100 
df.loc[df['ID'].str.startswith('BR'), 'Value'] /= 1000 
df['Value'] = df['Value'].astype(int) 
df 

enter image description here

+1

Dies interessant Dank sehr viel funktioniert! Der/= -Teil ist irgendwie verwirrend, warum das Divisionszeichen vor dem = Zeichen stehen würde. – staten12

+1

Es ähnelt den C _increment_/_decrement_ (++/-) Operatoren, aber Python, anstatt den Wert zu erhöhen oder zu verringern, weist den inkrementierten/dekrementierten Wert wieder der Variable zu. ZB: - 'var + = 1' ist eine Succit-Form des Schreibens der ausführlicheren' var = var + 1'. Gleicher Fall mit Division/Multiplikation auch. –

Verwandte Themen