在Pandas中为列名包含模式的多个列筛选数据帧

2024-09-26 22:53:56 发布

您现在位置:Python中文网/ 问答频道 /正文

当过滤多个列时,我看到了一些例子,我们可以使用类似于df[df['A'].str.contains("string") | df['B'].str.contains("string")]来过滤行。在

我有多个文件,我想在其中获取每个文件,并且只从包含'email'字符串的列名中获取那些带有'gmail.com'的行。在

因此,示例标头可以类似于:“firstname”“lastname”“companyname”“address”“emailid1”“emailid2”“emailid3”。。。在

emailid1..2..3的emailid包含gmail.com。我想获取gmail可以出现在其中任何一行中的行。在

for file in files:
    pdf = pd.read_csv('Reduced/'+file,delimiter = '\t')
    emailids = [col for col in pdf.columns if 'email' in col]
    #  pdf['gmail' in pdf[emailids]]

Tags: 文件incomdfforstringpdfemail
2条回答

您可以将^{}^{}一起使用:

pdf = pd.DataFrame({'A':[1,2,3],
                   'email1':['gmail.com','t','f'],
                   'email2':['u','gmail.com','t'],
                   'D':[1,3,5],
                   'E':[5,3,6],
                   'F':[7,4,3]})
print (pdf)
   A  D  E  F     email1     email2
0  1  1  5  7  gmail.com          u
1  2  3  3  4          t  gmail.com
2  3  5  6  3          f          t

#filter column names                   
emailids = [col for col in pdf.columns if 'email' in col]
print (emailids)
['email1', 'email2']

#apply string function for each filtered column
df = pd.concat([pdf[col].str.contains('gmail.com') for col in pdf[emailids]], axis=1)

print (df)
  email1 email2
0   True  False
1  False   True
2  False  False

#filter at least one True by any
print (pdf[df.any(1)])
   A  D  E  F     email1     email2
0  1  1  5  7  gmail.com          u
1  2  3  3  4          t  gmail.com

输入示例:

df = pd.DataFrame({'email': ['test@example.com', 'someone@gmail.com'], 'somethingelse': [1, 2], 'another_email': ['whatever@example.com', 'something@example.com']})

例如:

^{pr2}$

您可以筛选出包含email的列,查找gmail.com或您希望的任何文本,然后再选择子集,例如:

df[df.filter(like='email').applymap(lambda L: 'gmail.com' in L).any(axis=1)]

这给了你:

           another_email              email  somethingelse
1  something@example.com  someone@gmail.com              2

相关问题 更多 >

    热门问题