1

I have a pandas series:

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

Which looks like this:

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

and I want to make it like this:

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

Someone suggested code like this, but it didn't work...

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

I checked the following threads, but they didn't seem to be what I wanted either:

Pandas DataFrame, how do i split a column into two

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

Community
  • 1
  • 1
George Liu
  • 3,601
  • 10
  • 43
  • 69

4 Answers4

4

With and without using 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
Zero
  • 74,117
  • 18
  • 147
  • 154
1

Vectorized Numpy solution:

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
MaxU - stand with Ukraine
  • 205,989
  • 36
  • 386
  • 419
0

Use .map combined with string methods like below:

names.map(lambda s: s.split()[1] + ', ' + s.split()[0])
George Liu
  • 3,601
  • 10
  • 43
  • 69
0

First, define a function to reverse the name, utilizing the .split method. It takes the parameter where you want to split it at, in this case " " and returns a list of the two parts of your input string. From there we can reorganize the return string of our function how we like--in this case last name, first name.

Second, the reverse_names function takes in a Pandas series, applies the function reverse_name to each element in the series (with the .apply method) and then returns another Pandas Series.

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)

Your output should be something like this:

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
malanb5
  • 304
  • 2
  • 13