values replacing example column python pandas

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