2017-12-18 184 views
1

我需要使一些名称格式匹配稍后在我的脚本中进行合并。我列“名称”是从CSV导入并包含类似名称如下:如何从Python中的字符串中提取字符?

安东尼布朗

莱西恩·麦考伊

莱夫翁·贝尔

对于我的剧本,我想获得第一个名字的第一个字母,并与姓氏结合起来这样....

A.Brown

L.McCoy

L.Bell

这里是我已经把现在返回一个烤饼每次:

ff['AbbrName'] = ff['Name'].str.extract('([A-Z]\s[a-zA-Z]+)', expand=True)

谢谢!

+0

你不能使用apply()来执行将它分成两个单词的函数,并且从第一个单词加上第二个单词得到第一个字符。 – furas

+0

'.split('')'? –

+0

如果您的问题得到解答,请[投票,并接受最有帮助的](https://meta.stackexchange.com/a/5235)。谢谢。 –

回答

7

另一种选择使用str.replace方法与^([A-Z]).*?([a-zA-Z]+)$; ^([A-Z])捕获字符串开头的第一个字母; ([a-zA-Z]+)$最后一个字相匹配,然后由第一捕获组和第二组捕获之间加入.重建名称:

df['Name'].str.replace(r'^([A-Z]).*?([a-zA-Z]+)$', r'\1.\2') 
#0 A.Brown 
#1 L.McCoy 
#2  L.Bell 
#Name: Name, dtype: object 
+1

这里正则表达式真的有必要吗? –

+0

@COLDSPEED我倾向于认为正则表达式在此处有效,因为OP处理名称,在真实数据集中出现意外格式并不奇怪。 'Regex'有助于验证名称。 – Psidom

4

如果你只想apply()将由第一空间分割,并获得第一个字加入剩下的第一个字符的功能:

import pandas as pd 


def abbreviate(row): 
    first_word, rest = row['Name'].split(" ", 1) 
    return first_word[0] + ". " + rest 


df = pd.DataFrame({'Name': ['Antonio Brown', 'LeSean McCoy', "Le'Veon Bell"]}) 
df['AbbrName'] = df.apply(abbreviate, axis=1) 
print(df) 

打印:

  Name AbbrName 
0 Antonio Brown A. Brown 
1 LeSean McCoy L. McCoy 
2 Le'Veon Bell L. Bell 
+0

有时在名称列中可能只有名字? – Dark

+0

@Dark是的,我想我们需要知道在OP的特定情况下名称的可能值是什么,但好处是,我们可以创建一些输入来打破解决方案。谢谢。 – alecxe

0

你得到烤饼,因为你的正则表达式无法比拟的名字。

相反,我会尝试以下方法:

parts = ff[name].split(' ') 
ff['AbbrName'] = parts[0][0] + '.' + parts[1] 
+0

这不起作用? –

2

这应该是很简单的事,即使没有正则表达式。使用字符串拆分和串联的组合。

df.Name.str[0] + '.' + df.Name.str.split().str[-1] 

0 A.Brown 
1 L.McCoy 
2  L.Bell 
Name: Name, dtype: object 

如果在Name列具有前导空格的可能性,与df.Name.str.strip().str[0]更换df.Name.str[0]

警告:列最少必须有两个名字。

相关问题