2016-06-07 14 views
1

Ich versuche, mehrere Zeilen in meinem Panda-Datenrahmen bedingt zu aktualisieren. Hier ist meine Daten:Wie kann ich mehrere Spalten in einem Panda-Dataframe bedingt aktualisieren

df = pd.DataFrame([[1,1,1], [2,2,2], [3,3,3]], columns=list('ABC')) 

ich das Update tun kann ich in zwei Schritten wollen:

df.loc[df['A'] == 1, 'B'] = df['C'] +10 
df.loc[df['A'] == 1, 'A'] = df['C'] +11 

Oder ich kann in einem Schritt auf konstante Werte aktualisieren:

df.loc[df['A'] == 1, ['A', 'B']] = [11, 12] 

Aber ich kann Aktualisieren Sie nicht mehrere Spalten aus anderen Spalten in einem einzigen Schritt:

df.loc[df['A'] == 1, ['A', 'B']] = [df['C'] + 10, df['C'] + 11] 
... 
ValueError: shape mismatch: value array of shape (2,3) could not be broadcast to indexing result of shape (1,2) 

Irgendwelche Ideen wie ich das machen kann?


Edit: Danke @EdChum für die einfache Lösung für den einfachen Fall - hat die Frage aktualisiert, um eine komplexere Realität zu demonstrieren.

+1

nicht sicher, dass Sie das tun können, ist das Problem, dass die Ausrichtung auf den Spalten- und Indexnamen auftreten wird, und es ist einen skalar oder 1 erwartet -d Array für die Zuweisung – EdChum

+0

Die Realität hier ist, dass es keine einfache Möglichkeit, dass ich weiß, um dies zu tun, sehe ich nichts falsch mit dem Aufteilen der Anweisungen in separate Zuweisungen, wenn Sie versuchen, jeder Spalte unterschiedliche Werte zuweisen – EdChum

+0

Ich versuche um zu vermeiden, dass die (möglicherweise komplexe) Indexierungsklausel dupliziert wird. Auch wenn ich mehrere Anweisungen verwende, muss ich möglicherweise die Ergebnisse in temporären Spalten speichern und dann die Spalten A und B durch solche ersetzen, d. H. Es werden 4 Anweisungen. – Matthew

Antwort

1

Sie brauchen hier nicht über ein 2-Element-Liste zu übergeben:

In [52]: 
df.loc[df['A'] == 1, ['A', 'B']] = df['C'] + 10 
df 

Out[52]: 
    A B C 
0 11 11 1 
1 2 2 2 
2 3 3 3 

Die Zuordnung auf die linke Skala wird nur funktionieren, wenn die rhs wird an die Form auf die linke Skala übertragen

+0

Fairer Punkt - meine Absicht war, ein Beispiel zu geben. Das "Produktionsproblem", das ich zu lösen versuche, beinhaltet vielfältigere Funktionen auf der rechten Seite. Habe das Beispiel aktualisiert, um die erhöhte Komplexität zu berücksichtigen :). Gibt es eine Einzelschrittlösung für das generische Problem? – Matthew

1

I sind noch sicher, ob es der beste Weg, das zu erreichen, aber es funktioniert:

In [284]: df.loc[df['A'] == 1, ['A', 'B']] = pd.DataFrame({'A':df.C + 10, 'B':df.C + 11}, index=df.index) 

In [285]: df 
Out[285]: 
    A B C 
0 11 12 1 
1 2 2 2 
2 3 3 3 
+0

Nein - ich würde erwarten (A, 0) == 11 und (A, 1) == 12 – Matthew

+0

@Matthew, ich habe meine Antwort aktualisiert - bitte überprüfen Sie – MaxU

+0

Ja - das scheint die richtige Idee! Immer noch ein bisschen ausführlich. Ich denke, das sollte funktionieren, aber nicht:/df.loc [df ['A'] == 1, ['A', 'B']] = (df [['C', 'C ']] + [10,11]) '' ' – Matthew

Verwandte Themen