Un po 'in ritardo rispetto al gioco, ma ecco un modo per creare una funzione che ordina gli oggetti serieFrame, DataFrame e multiindex DataFrame utilizzando funzioni arbitrarie.
Mi avvalgo del metodo df.iloc[index]
, che fa riferimento a una riga in un Series/DataFrame in base alla posizione (rispetto a df.loc
, che fa riferimento per valore). Usando questo, dobbiamo solo avere una funzione che restituisce una serie di argomenti posizionali:
def sort_pd(key=None,reverse=False,cmp=None):
def sorter(series):
series_list = list(series)
return [series_list.index(i)
for i in sorted(series_list,key=key,reverse=reverse,cmp=cmp)]
return sorter
È possibile utilizzare questo per creare funzioni di ordinamento personalizzato. Questo funziona sulla dataframe utilizzato in risposta di Andy Hayden:
df = pd.DataFrame([
[1, 2, 'March'],
[5, 6, 'Dec'],
[3, 4, 'April']],
columns=['a','b','m'])
custom_dict = {'March':0, 'April':1, 'Dec':3}
sort_by_custom_dict = sort_pd(key=custom_dict.get)
In [6]: df.iloc[sort_by_custom_dict(df['m'])]
Out[6]:
a b m
0 1 2 March
2 3 4 April
1 5 6 Dec
Questo funziona anche su DataFrames multiindex e serie di oggetti:
months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
df = pd.DataFrame([
['New York','Mar',12714],
['New York','Apr',89238],
['Atlanta','Jan',8161],
['Atlanta','Sep',5885],
],columns=['location','month','sales']).set_index(['location','month'])
sort_by_month = sort_pd(key=months.index)
In [10]: df.iloc[sort_by_month(df.index.get_level_values('month'))]
Out[10]:
sales
location month
Atlanta Jan 8161
New York Mar 12714
Apr 89238
Atlanta Sep 5885
sort_by_last_digit = sort_pd(key=lambda x: x%10)
In [12]: pd.Series(list(df['sales'])).iloc[sort_by_last_digit(df['sales'])]
Out[12]:
2 8161
0 12714
3 5885
1 89238
Per me questo si sente pulito, ma utilizza le operazioni di pitone pesantemente piuttosto che fare affidamento su operazioni panda ottimizzate. Non ho effettuato test di stress ma immagino che questo potrebbe rallentare su DataFrames di grandi dimensioni. Non sei sicuro di come il rendimento si paragona all'aggiunta, all'ordinamento e all'eliminazione di una colonna. Qualche consiglio su come accelerare il codice sarebbe apprezzato!
Una colonna contiene il nome del mese significa che esiste una colonna che contiene i nomi dei mesi (come risposta) o molte colonne con i nomi delle colonne come nomi dei mesi (come eumiro)? –