Ich verwende pandas Version 0.14.1 mit Python 2.7.5, und ich habe mit drei Spalten einen Datenrahmen, zB:Was ist die korrekte Syntax, um Spaltenwerte für ausgewählte Zeilen in einem Pandas-Datenrahmen mit nur einer Zeile zu vertauschen?
import pandas as pd
d = {'L': ['left', 'right', 'left', 'right', 'left', 'right'],
'R': ['right', 'left', 'right', 'left', 'right', 'left'],
'VALUE': [-1, 1, -1, 1, -1, 1]}
df = pd.DataFrame(d)
idx = (df['VALUE'] == 1)
Ergebnisse in einem Datenrahmen, die wie folgt aussieht:
L R VALUE
0 left right -1
1 right left 1
2 left right -1
3 right left 1
4 left right -1
5 right left 1
Für Zeilen, wo VALUE == 1
, würde ich gerne den Inhalt der linken und rechten Spalten, so dass alle "links" Werte unter der "L" -Spalte, und die "richtigen" Werte enden unter der Spalte "R"
Nachdem sie bereits definiert die idx
Variable oben, kann ich diese drei weitere Linien in nur leicht tun, indem Sie eine temporäre Variable wie folgt:
tmp = df.loc[idx,'L']
df.loc[idx,'L'] = df.loc[idx,'R']
df.loc[idx,'R'] = tmp
aber dies scheint wie wirklich klobig und unförmig Syntax zu mir; sicherlich unterstützt pandas etwas prägnanter? Ich habe bemerkt, dass, wenn ich die Reihenfolge der Spalten in der Eingabe in den Datenrahmen .loc
Attribut tauschen, dann erhalte ich die folgende tauschte Ausgabe:
In [2]: print(df.loc[idx,['R','L']])
R L
1 left right
3 left right
5 left right
Dies ist für mich schlägt vor, dass ich in der Lage sollte die gleiche Swap zu implementieren wie oben, nur um die folgende Zeile ein:
df.loc[idx,['L','R']] = df.loc[idx,['R','L']]
jedoch, wenn ich dies tatsächlich versuchen, passiert nichts - die Spalten nicht vertauscht bleiben. Es ist, als ob Pandas automatisch erkennt, dass ich die Spalten in der falschen Reihenfolge auf der rechten Seite der Zuweisungsanweisung platziert habe, und es automatisch das Problem korrigiert. Gibt es eine Möglichkeit, dass ich diese "Spaltenreihenfolge-Autokorrektur" in Pandas-Zuweisungsanweisungen deaktivieren kann, um den Austausch zu implementieren, ohne unnötige temporäre Variablen zu erzeugen?
Sieht man bei dataframe.eval? Sie haben ein Beispiel in Pandas docs: >>> df = Datenrahmen (randn (10, 2), Spalten = Liste ('ab')) >>> df.eval ('a + b') >>> df. eval ('c = a + b') – Rainy
Für alle, die neugierig sind, habe ich eine Follow-up-Frage geschrieben: http://StackOverflow.com/Questions/25811529/setting-Values-on-a-subset-of-rows -indexing-boolean-setting – JohnE