如何解决如何解决 AttributeError:只能使用带有字符串值的 .str 访问器
当我使用以下代码时,发生了 AttributeError。详细信息如下所示。
import pandas as pd
import numpy as np
from pandas import DataFrame as df
import re
data = {'Tim': 'Tim@google.com','Rob': 'Rob@gmail.com','Jen': 'Jen@gmail.com','Wes': np.nan}
data = pd.Series(data)
pattern = r'([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})'
matches = data.str.match(pattern,flags=re.IGnorECASE)
matches.str.get(1)
下面显示的是发生的 AttributeError。
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-13-e12b5eab19b6> in <module>
6 matches = data.str.match(pattern,flags=re.IGnorECASE)
7
----> 8 matches.str.get(1)
AttributeError: Can only use .str accessor with string values!
---------------------------------------------------------------------------
In : matches.str.get(1)
Out:
Tim google
Rob gmail
Jen gmail
Wes NaN
解决方法
你需要做的:
matches = data.str.findall(pattern,flags=re.IGNORECASE)
matches.str.get(0).str.get(1)
,
如果你的最终目标是得到想要的结果,你可以简单地解析你的数据
您的示例数据:
print(data)
Tim Tim@google.com
Rob Rob@gmail.com
Jen Jen@gmail.com
Wes NaN
我们可以简单地使用 str
方法和 split
函数,如下所示,我们将获得所需的名称。
df.str.split('.').str[-2]
Tim google
Rob gmail
Jen gmail
Wes NaN
或
您可以使用@Allen 的解决方案,将 match()
替换为 findall()
,因为它符合要求,因为您有系列数据 data = pd.Series(data)
,请参阅下面的区别..
findall() 查找系列/索引中所有出现的模式或正则表达式。相当于对所有元素应用 re.findall()
match() 确定每个字符串是否与正则表达式匹配。调用 re.match() 并返回一个布尔值
pattern = r'([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})'
matches = data.str.findall(pattern,flags=re.IGNORECASE)
matches.str.get(0).str.get(1)
Tim google
Rob gmail
Jen gmail
Wes NaN
dtype: object
为了解决错误,AttributeError: Can only use .str accessor with string values!
你应该使用 astype(str).str
因为 data
有它抱怨的浮点值 .
。
因此,您可以尝试下面的方法,但不会返回您想要的内容。
matches.astype(str).str.get(1)
Tim r
Rob r
Jen r
Wes a
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。