python - replacing - Clasificación personalizada en panda dataframe
replace values dataframe column pandas (3)
Pandas 0.15 introdujo la Serie Categórica , que permite una forma mucho más clara de hacer esto:
Primero, haga que la columna del mes sea categórica y especifique el orden de uso.
In [21]: df[''m''] = pd.Categorical(df[''m''], ["March", "April", "Dec"])
In [22]: df # looks the same!
Out[22]:
a b m
0 1 2 March
1 5 6 Dec
2 3 4 April
Ahora, al ordenar la columna del mes, se ordenará con respecto a esa lista:
In [23]: df.sort("m")
Out[23]:
a b m
0 1 2 March
2 3 4 April
1 5 6 Dec
Nota: si un valor no está en la lista, se convertirá a NaN.
Una respuesta más antigua para los interesados ...
Puede crear una serie intermediaria y set_index
sobre eso:
df = pd.DataFrame([[1, 2, ''March''],[5, 6, ''Dec''],[3, 4, ''April'']], columns=[''a'',''b'',''m''])
s = df[''m''].apply(lambda x: {''March'':0, ''April'':1, ''Dec'':3}[x])
s.sort()
In [4]: df.set_index(s.index).sort()
Out[4]:
a b m
0 1 2 March
1 3 4 April
2 5 6 Dec
Como se comentó, en los pandas más nuevos, la serie tiene un método de replace
para hacer esto de manera más elegante:
s = df[''m''].replace({''March'':0, ''April'':1, ''Dec'':3})
La pequeña diferencia es que esto no aumentará si hay un valor fuera del diccionario (permanecerá igual).
Tengo el marco de datos de python pandas, en el que una columna contiene el nombre del mes.
¿Cómo puedo hacer una clasificación personalizada utilizando un diccionario, por ejemplo:
custom_dict = {''March'':0, ''April'':1, ''Dec'':3}
Un poco tarde para el juego, pero esta es una forma de crear una función que clasifique los objetos de Frameworks Series, DataFrame y DataFrame multiindex utilizando funciones arbitrarias.
Hago uso del método df.iloc[index]
, que hace referencia a una fila en un Series / DataFrame por posición (en comparación con df.loc
, que hace referencia por valor). Usando esto, solo tenemos que tener una función que devuelva una serie de argumentos posicionales:
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
Puede usar esto para crear funciones de clasificación personalizadas. Esto funciona en el marco de datos utilizado en la respuesta de 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
Esto también funciona en objetos DataFrames y Series de múltiples índices:
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
Para mí, esto se siente limpio, pero usa las operaciones de Python en lugar de depender de operaciones optimizadas de pandas. No he hecho ninguna prueba de estrés, pero me imagino que esto podría ser lento en DataFrames muy grandes. No estoy seguro de cómo se compara el rendimiento con agregar, clasificar y luego eliminar una columna. ¡Cualquier consejo sobre acelerar el código sería apreciado!
import pandas as pd
custom_dict = {''March'':0,''April'':1,''Dec'':3}
df = pd.DataFrame(...) # with columns April, March, Dec (probably alphabetically)
df = pd.DataFrame(df, columns=sorted(custom_dict, key=custom_dict.get))
devuelve un DataFrame con columnas de marzo, abril y diciembre