在Python DataFrame中拆分字符串

时间:2015-09-06 15:48:06

标签: python string pandas dataframe

我在Python中有一个带有名称列的DataFrame(例如Joseph Haydn,Wolfgang Amadeus Mozart,Antonio Salieri等)。

我希望得到一个带有姓氏的新专栏:海顿,莫扎特,萨列里等等。

我知道如何分割字符串,但我找不到将其应用于系列或数据框列的方法。

2 个答案:

答案 0 :(得分:14)

如果你有:

import pandas
data = pandas.DataFrame({"composers": [ 
    "Joseph Haydn", 
    "Wolfgang Amadeus Mozart", 
    "Antonio Salieri",
    "Eumir Deodato"]})

假设您只想要名字(而不是像Amadeus这样的中间名):

data.composers.str.split('\s+').str[0]

会给:

0      Joseph
1    Wolfgang
2     Antonio
3       Eumir
dtype: object

您可以将其分配到同一数据框中的新列:

data['firstnames'] = data.composers.str.split('\s+').str[0]

姓氏将是:

data.composers.str.split('\s+').str[-1]

给出:

0      Haydn
1     Mozart
2    Salieri
3    Deodato
dtype: object

(另请参阅Python Pandas: selecting element in array column访问“'数组”列中的元素)

对于除姓氏之外的所有名称,您可以将" ".join(..)应用于除每行的最后一个元素([:-1])之外的所有元素:

data.composers.str.split('\s+').str[:-1].apply(lambda parts: " ".join(parts))

给出:

0              Joseph
1    Wolfgang Amadeus
2             Antonio
3               Eumir
dtype: object

答案 1 :(得分:0)

尝试以下方法解决您的问题:

import pandas as pd
df = pd.DataFrame(
    {'composers':
        [ 
            'Joseph Haydn', 
            'Wolfgang Amadeus Mozart', 
            'Antonio Salieri',
            'Eumir Deodato',
        ]
    }
)

df['lastname'] = df['composers'].str.split(n = 0, expand = False).str[1]

您现在可以找到DataFrame,如下所示。

composers   lastname
0   Joseph Haydn    Haydn
1   Wolfgang Amadeus Mozart Amadeus Mozart
2   Antonio Salieri Salieri
3   Eumir Deodato   Deodato