Cómo revertir el orden del nombre y apellido en una serie de Pandas

Tengo una serie de pandas:

names = pd.Series([ 'Andre Agassi', 'Barry Bonds', 'Christopher Columbus', 'Daniel Defoe', 'Emilio Estevez', 'Fred Flintstone', 'Greta Garbo', 'Humbert Humbert', 'Ivan Ilych']) 

Que se parece a esto:

 0 Andre Agassi 1 Barry Bonds 2 Christopher Columbus 3 Daniel Defoe 4 Emilio Estevez 5 Fred Flintstone 6 Greta Garbo 7 Humbert Humbert 8 Ivan Ilych 

Y quiero hacerlo así:

 0 Agassi, Andre 1 Bonds, Barry 2 Columbus, Christopher 3 Defoe, Daniel 4 Estevez, Emilio 5 Flintstone, Fred 6 Garbo, Greta 7 Humbert, Humbert 8 Ilych, Ivan 

Alguien sugirió un código como este, pero no funcionó …

 names.apply(split)[1]+', ' + names.apply(split)[0] 

Revisé los siguientes hilos, pero tampoco parecían ser lo que yo quería:

Pandas DataFrame, ¿cómo se divide una columna en dos

pandas: ¿Cómo divido el texto en una columna en varias filas?

¿Con y sin usar str.replace ?

 In [451]: names.str.split().apply(lambda x: ', '.join(x[::-1])) Out[451]: 0 Agassi, Andre 1 Bonds, Barry 2 Columbus, Christopher 3 Defoe, Daniel 4 Estevez, Emilio 5 Flintstone, Fred 6 Garbo, Greta 7 Humbert, Humbert 8 Ilych, Ivan dtype: object In [452]: names.apply(lambda x: ', '.join(x.split()[::-1])) Out[452]: 0 Agassi, Andre 1 Bonds, Barry 2 Columbus, Christopher 3 Defoe, Daniel 4 Estevez, Emilio 5 Flintstone, Fred 6 Garbo, Greta 7 Humbert, Humbert 8 Ilych, Ivan dtype: object 

Solución numpy vectorizada:

 In [276]: arr = names.str.split(expand=True).values[:, ::-1] In [277]: names.values[:] = np.sum(np.insert(arr, 1, ', ', axis=1), axis=1) In [278]: names Out[278]: 0 Agassi, Andre 1 Bonds, Barry 2 Columbus, Christopher 3 Defoe, Daniel 4 Estevez, Emilio 5 Flintstone, Fred 6 Garbo, Greta 7 Humbert, Humbert 8 Ilych, Ivan dtype: object 

Utilice .map combinado con métodos de cadena como a continuación:

 names.map(lambda s: s.split()[1] + ', ' + s.split()[0]) 

Primero, defina una función para revertir el nombre, utilizando el método .split. Toma el parámetro donde desea dividirlo en, en este caso “” y devuelve una lista de las dos partes de la cadena de entrada. Desde allí podemos reorganizar la cadena de retorno de nuestra función como nos guste: en este caso, apellido, primer nombre.

Segundo, la función reverse_names toma una serie de Pandas, aplica la función reverse_name a cada elemento de la serie (con el método .apply) y luego devuelve otra Serie de Pandas.

 def reverse_name(name): split_name = name.split(" ") first_name = split_name[0] last_name = split_name[1] return last_name + ", " + first_name def reverse_names(names): return names.apply(reverse_name) print reverse_names(names) 

Tu salida debería ser algo como esto:

 0 Agassi, Andre 1 Bonds, Barry 2 Columbus, Christopher 3 Defoe, Daniel 4 Estevez, Emilio 5 Flintstone, Fred 6 Garbo, Greta 7 Humbert, Humbert 8 Ilych, Ivan 9 Joyce, James 10 Knightley, Keira 11 Lane, Lois 12 Myers, Mike 13 Nolte, Nick 14 Osbourne, Ozzy 15 Picasso, Pablo 16 Quirrell, Quirinus 17 Ray, Rachael 18 Sarandon, Susan 19 Turner, Tina 20 Urbina, Ugueth 21 Vaughn, Vince 22 Wilson, Woodrow 23 Yamada, Yoji 24 Zidane, Zinedine dtype: object