在 Pandas 中为列名包含模式的多列过滤 DataFrame

Posted

技术标签:

【中文标题】在 Pandas 中为列名包含模式的多列过滤 DataFrame【英文标题】:Filtering DataFrames in Pandas for multiple columns where a column name contains a pattern 【发布时间】:2017-01-13 20:53:45 【问题描述】:

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

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

所以一个示例标题可以是:'firstname' 'lastname' 'companyname' 'address' 'emailid1' 'emailid2' 'emailid3' ...

emailid1..2..3 列的电子邮件 ID 包含 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]]

【问题讨论】:

【参考方案1】:

给定示例输入:

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

例如:

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

您可以过滤掉包含电子邮件的列,查找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

【讨论】:

【参考方案2】:

您可以将anyboolean indexing 一起使用:

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

【讨论】:

以上是关于在 Pandas 中为列名包含模式的多列过滤 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中为 pandas 创建一个“非”过滤器

如何从 Pandas 数据框中过滤包含字符串模式的行 [重复]

使用 Pandas 在 Python 中过滤嵌套的 JSON 数据

在pandas中提取包含多行和多列的JSON字符串列的部分

一次在多列上使用 pandas groupby().apply(list) [重复]

Pandas 通过子字符串匹配过滤数据框列