如何颠倒Pandas系列中名字和姓氏的顺序

时间:2017-02-12 15:32:32

标签: python pandas series

我有一个熊猫系列:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

Vectorized 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

答案 2 :(得分:0)

使用.map结合下面的字符串方法:

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

答案 3 :(得分: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