[英]Filter by condition if string contains certain substring
我有一个充满电子邮件的数据框。 知道 gmail 最少有 6 个字符,我想通过删除用户名少于 6 个字符的任何 gmail 地址来过滤我的数据框。 因此,数据帧df
>> print(df)
email
1 a@gmail.com
2 real.email@gmail.com
3 no.email@email.com
4 real@yahoo.com
5 poo@gmail.com
会成为:
email
2 real.email@gmail.com
3 no.email@email.com
4 real@yahoo.com
使用
df = df[
(len(df['email'].str.split('@').str[0]) >= 6)
(df['email'].str.split('@').str[1] == 'gmail.com')
]
将过滤所有不是@gmail.com 的内容,所以我不能使用它。 我想要的是本质上(这显然不起作用并给出了一个TypeError: 'method' object is not subscriptable
)
if df['email'].str.split['@'].str[1] == 'gmail.com':
len(df['email'].str.split['@'].str[0]) >= 6
如何在矢量化操作中完成此操作?
您可以使用:
a = df['email'].str.contains('gmail') #check if email has gmail
b = df['email'].str.split('@').str[0].str.len().gt(6) #check if length before "@" > 6
out = df[a&b|~a]
print(out)
email
2 real.email@gmail.com
3 no.email@email.com
4 real@yahoo.com
看到这个:
>>> df[(df["email"].str.split("@").str[0].str.len() >= 6) | (df["email"].str.split("@").str[1] != 'gmail.com')]
email
1 real.email@gmail.com
2 no.email@email.com
3 real@yahoo.com
关于您所说的“将过滤所有不是@gmail.com 的内容”,这是不正确的。 您只需要使您的布尔逻辑正确(如上)。 同样要测量数据帧中的字符串长度,您应该使用.str.len()
但不要取整个数据帧输出的len
,后者将是数据帧的大小。
你可以做:
df=df.loc[~df.email.str.contains(r"^.{0,5}@gmail\.com$")]
输出:
email
1 real.email@gmail.com
2 no.email@email.com
3 real@yahoo.com
一种方法是将索引存储在列表中,然后只显示这些索引:
ls=[]
for i in range(0,len(df)):
if df['email'][i].split('@')[1] == 'gmail.com':
if len(df['email'][i].split('@')[0]) >= 6:
ls.append(i)
df[df.index.isin(ls)]
输出:
email
1 real.email@gmail.com
2 no.email@email.com
3 real@yahoo.com
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.