如果字符串包含某些子字符串,则按条件过滤

时间:2020-02-13 18:08:11

标签: python pandas

我有一个充满电子邮件的数据框。知道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

如何在矢量化操作中完成此操作?

4 个答案:

答案 0 :(得分:2)

您可以使用:

insertOne

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]

答案 1 :(得分:1)

看到这个:

>>> 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,后者将是数据帧的大小。

答案 2 :(得分:1)

您可以这样做:

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

答案 3 :(得分:0)

一种方法是将索引存储在列表中,然后仅显示那些索引:

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