从另一列中特定字符的索引在Pandas数据框中创建新列

时间:2016-11-04 21:58:16

标签: python string indexing

我有一个Pandas数据框,其中包含一列电子邮件:

Email
kitty@gmail.com
cat@yahoo.com
dog@aol.com
person@hrc.com

此列/系列的数据类型是UNICODE,它似乎不适用于我尝试做的事情。我想要得到的只是str格式的电子邮件域名,如下所示:

Domain
gmail.com
yahoo.com
aol.com
hrc.com

我试过这样做:

df['domain'] = df['Email'][:,df['Email'].find('@'):]

但我收到属性错误:''系列' object没有属性' find''。

我已经在Stack Overflow上搜索过但是只找到了基于单个选择整数选择子串的方法,但是由于' @&的位置不适用于这种情况#39;每种情况都不同。我真的很想避免使用for循环来做到这一点。有没有人知道一个简单的方法来实现这一目标?我认为UNICODE数据类型可能会干扰。

编辑: 当我在一个单独的环境(iPython)中创建示例数据时,@ rojeeer提供的解决方案效果很好,但是在Databricks(Python 2.7.10)的表中使用它时,我不断得到错误:

TypeError: split() got an unexpected keyword argument 'return_type'
TypeError: split() got an unexpected keyword argument 'expand'

我认为这是因为我表中的数据被编码为Unicode(或未编码)。我已经尝试了几种方法将其转换为str:

df[‘email’] = df[‘email’].map(lambda x: x.encode("utf-8"))
df[‘email’] = df[‘email’].encode("utf-8")

我还尝试通过尝试这些方法来规范化数据:

import unicodedata as ucd
df[‘email’] = ucd.normalize('NFKD', df[‘email’])

import unicodedata as ucd
df[‘email’] = ucd.normalize('NFKD', df[‘email’]).encode(‘ascii’,’ignore’)

import unicodedata as ucd

df[‘email’]= df[‘email’].map(lambda x: ucd.normalize('NFKD', x))

这些不断返回错误:

AttributeError: 'NoneType' object has no attribute 'encode'
TypeError: must be unicode, not None

如何将此系列转换为str?

1 个答案:

答案 0 :(得分:0)

在Pandas中,str函数无法直接调用,您需要将其称为df.str.function,请参阅Working with text

对于您的应用程序,我认为您可以选择两个函数:str.splitstr.extractstr.split的{​​{1}}与Series非常相似,split通过常规快速分隔符分割字符串。虽然str更强大,可以指定如何提取。

以下是示例代码:

str.extract

设置In [16]: df['Email'].str.split('@', expand=True) Out[16]: 0 1 0 kitty gmail.com 1 cat yahoo.com 2 dog aol.com 3 person hrc.com 会将expand=True扩展为Series,其中包含与拆分结果长度相同的列数。

希望这会有所帮助。