2017-02-12 5 views
1

У меня есть ряд панд:Как изменить порядок имени и фамилии в серии панды

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

который выглядит следующим образом:

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 

, и я хочу сделать это так :

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 

Кто-то предложил такой код, но он не работает ...

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

Я проверил следующие темы, но они, кажется, не то, что я хотел либо:

Pandas DataFrame, how do i split a column into two

pandas: How do I split text in a column into multiple rows?

ответ

4

С использованием и без использования 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 
0

Использование .map в сочетании с методами строк, как показано ниже:

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

Векторизованное Numpy решение:

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 
0

Во-первых, определить функцию обратного имя, используя метод .split. Он принимает параметр, в который вы хотите разбить его, в этом случае «» и возвращает список двух частей вашей строки ввода. Оттуда мы можем реорганизовать возвращаемую строку нашей функции, как нам нравится - в данном случае фамилию, имя.

Во-вторых, функция reverse_names принимает серию Pandas, применяет функцию reverse_name к каждому элементу серии (с помощью метода .apply), а затем возвращает еще одну серию 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) 

Ваш результат должен быть что-то вроде этого:

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 

записку о том, что содержание пришли из Udacity. Они полностью владеют этим контентом и решением.

Смежные вопросы