我有一个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?
答案 0 :(得分:0)
在Pandas中,str
函数无法直接调用,您需要将其称为df.str.function
,请参阅Working with text。
对于您的应用程序,我认为您可以选择两个函数:str.split
和str.extract
。 str.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
,其中包含与拆分结果长度相同的列数。
希望这会有所帮助。