Ci sono almeno alcuni approcci per accorciare la sintassi per questo in Pandas, fino a quando non ottiene un'intera API di query lungo il strada (perhap s Proverò ad unirmi al progetto github e fare questo è tempo permesso e se nessun altro è già partito).
Un metodo per accorciare la sintassi un po 'è il seguente:
inds = df.apply(lambda x: x["A"]>10 and x["B"]<5, axis=1)
print df[inds].to_string()
Per risolvere completamente questo, uno avrebbe bisogno di costruire qualcosa come l'SQL selezionare e dove le clausole in Panda. Questo non è affatto banale, ma una pugnalata che penso possa funzionare per questo è usare il modulo integrato Python operator
. Questo ti permette di trattare cose più grandi che funzioni invece che simboli. Così si potrebbe effettuare le seguenti operazioni:
def pandas_select(dataframe, select_dict):
inds = dataframe.apply(lambda x: reduce(lambda v1,v2: v1 and v2,
[elem[0](x[key], elem[1])
for key,elem in select_dict.iteritems()]), axis=1)
return dataframe[inds]
Poi un esempio di prova come il vostro potrebbe essere quella di effettuare le seguenti operazioni:
import operator
select_dict = {
"A":(operator.gt,10),
"B":(operator.lt,5)
}
print pandas_select(df, select_dict).to_string()
è possibile abbreviare la sintassi ancora di più da una costruzione in più argomenti per pandas_select
a gestire automaticamente i diversi operatori logici comuni o importarli nello spazio dei nomi con nomi più brevi.
Si noti che la funzione pandas_select
sopra funziona solo con logiche e catene di vincoli. Dovresti modificarlo per ottenere un comportamento logico diverso. Oppure usa not
e le leggi di DeMorgan.
Grazie ancora. Pubblicheremo domande future sulla mailing list. Ma per ora, e se volessi farlo a livello di programmazione? Hai avuto un elenco di etichette di colonne ... come hai potuto inserirlo nel '|' notazione? Per esempio. se 'labels = ['A', 'B', 'C', ... ']' – user248237dfsf
Per chiarire: L'approccio 'any (1)' non funzionerebbe se tu avessi altri valori nella tabella che non hai voglio filtrare Supponiamo che ci siano molte colonne e vuoi solo che 'any' si applichi a un sottoinsieme di esse (conosci le etichette del sottoinsieme). – user248237dfsf