在pandas数据框的列上进行子字符串操作

4
我希望从pandas dataframe的“Name”列中提取一个子字符串(头衔 - 先生,夫人,小姐等),然后将新列(Title)写回数据框中。
在数据框的“Name”列中,我有一个名字,例如“Brand, Mr. Owen Harris”。两个分隔符是逗号和句点。
我尝试使用split方法,但这只会将原始字符串在列表中分成两部分。因此,我仍然得到了列表中的['Braund','Mr. Owen Harris']。
import pandas as pd
#import re
df_Train = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vTliZmavBsJCFDiEwxcSIIftu-0gR9p34n8Bq4OUNL4TxwHY-JMS6KhZEbWr1bp91UqHPkliZBBFgwh/pub?gid=1593012114&single=true&output=csv')
a= df_Train['Name'].str.split(',')
for i in a:
    print(i[1])

我认为这可能涉及到正则表达式。我的研究表明,使用前向查找 (?=,) 和后向查找 (?<='.') 的方法可以解决问题。例如:

import re
a= df_Train['Name'].str.split(r'(?=,)*(?<='.'))
for i in a:
    print(i)
    print(i[1])`

但我遇到了错误(扫描字符串文字时的EOL)。有人能给我指点一下方向吗?

谢谢, Mike

2个回答

8
你可以这样做。
df_Train.Name.str.split(',').str[1].str.split('.').str[0].str.strip()

输出前五行:
0       Mr
1      Mrs
2     Miss
3      Mrs
4       Mr

结果总结

df_Train.Name.str.split(',').str[1].str.split('.').str[0].str.strip()\
             .value_counts()

输出

Mr              517
Miss            182
Mrs             125
Master           40
Dr                7
Rev               6
Mlle              2
Col               2
Major             2
Lady              1
Mme               1
Sir               1
Ms                1
the Countess      1
Jonkheer          1
Don               1
Capt              1
Name: Name, dtype: int64

你在这个例子中使用了哪个数据集? - maxymoo
好的,太棒了。我不知道你可以这样链式调用方法。 - Mike
啊,错过了那个。只需要在生成的序列上调用.value_counts()即可,而不是使用.to_frame().groupby('Name')['Name'].count() - maxymoo
我不太理解这是如何工作的。str[1] 的作用是什么?有人能解释一下吗? - deadcode
2
@deadcode,.str访问器作用于一个列表上,str[1]是获取由split(',')创建的列表中的第二个元素。所以在 "Brand, Mr. Owen Harris" 这个例子中,split(',') 返回一个包含两个元素的列表 ["Brand", "Mr. Owen Harris"],然后我们使用 str[1] 来获取第二个元素 "Mr. Owen Harris",再将该字符串使用 split('.') 分割成 ["Mr", "Owen Harris"],然后再次使用 .str 访问器来获取列表中的第一个元素,即 .str[0]。 - Scott Boston
哦,是的。谢谢! - deadcode

2

错误来自于你在单引号的正则表达式字符串字面量中使用了单引号包围句点;实际上这不是正确的语法,我认为你应该使用转义句点,即r'(?=,)*(?<=\.)。然而,在这里你不需要使用前瞻/后顾,更常见和简单的方法是使用捕获组来描述你的正则表达式;在这种情况下,正则表达式应该是

df_Train['Name'].str.extract(", (\w*)\.")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接