Sto usando pandas versione 0.14.1 con Python 2.7.5, e ho un frame di dati con tre colonne, ad esempio:Qual è la sintassi corretta per scambiare i valori di colonna per le righe selezionate in un frame di dati panda usando solo una riga?
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)
risultati in un frame di dati che assomiglia a questo:
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
Per le righe dove VALUE == 1
, vorrei scambiare il contenuto delle colonne sinistra e destra, in modo che tutti i valori "a sinistra" finiscano sotto la colonna "L" ei valori "a destra" finiscano sotto Colonna "R".
Avendo già definito la variabile idx
sopra, posso facilmente fare questo in soli tre più linee, utilizzando una variabile temporanea come segue:
tmp = df.loc[idx,'L']
df.loc[idx,'L'] = df.loc[idx,'R']
df.loc[idx,'R'] = tmp
tuttavia questo sembra come la sintassi davvero goffo e poco elegante per me; sicuramente i panda supportano qualcosa di più succinto? Ho notato che se scambiare l'ordine delle colonne nell'input all'attributo frame di dati .loc
, quindi ottengo il seguente output scambiati:
In [2]: print(df.loc[idx,['R','L']])
R L
1 left right
3 left right
5 left right
Questo mi suggerisce che dovrei essere in grado di attuare la stessa scambio come sopra, utilizzando solo la seguente riga:
df.loc[idx,['L','R']] = df.loc[idx,['R','L']]
Tuttavia quando effettivamente provare questo, non succede nulla - le colonne rimangono unswapped. È come se i Panda riconoscessero automaticamente che ho messo le colonne nell'ordine sbagliato sul lato destro dell'istruzione di assegnazione, e corregge automaticamente il problema. C'è un modo per disabilitare questa "correzione automatica dell'ordine delle colonne" nelle istruzioni di assegnazione dei panda, al fine di implementare lo swap senza creare variabili temporanee non necessarie?
Hai guardato dataframe.eval? Hanno esempio in documenti panda: >>> df = DataFrame (randn (10, 2), colonne = lista ('ab')) >>> df.eval ('a + b') >>> df. eval ('c = a + b') – Rainy
Per chi è curioso, ho postato una domanda successiva: http://stackoverflow.com/questions/25811529/impostando-values-on-a-subset-of-rows -indexing-boolean-setting – JohnE