【问题标题】:Python/Pandas: Drop rows from data frame on string match from listPython / Pandas:从列表中的字符串匹配的数据框中删除行
【发布时间】:2015-07-27 21:13:33
【问题描述】:

我有一个联系信息的 .csv 文件,我将其作为 pandas 数据框导入。

>>> import pandas as pd
>>> 
>>> df = pd.read_csv('data.csv')
>>> df.head()

  fName   lName                    email   title
0  John   Smith         jsmith@gmail.com     CEO
1   Joe   Schmo      jschmo@business.com  Bagger
2  Some  Person  some.person@hotmail.com   Clerk

导入数据后,我想删除一个字段包含列表中多个子字符串之一的行。例如:

to_drop = ['Clerk', 'Bagger']

for i in range(len(df)):
    for k in range(len(to_drop)):
        if to_drop[k] in df.title[i]:
            # some code to drop the rows from the data frame

df.to_csv("results.csv")

在 Pandas 中执行此操作的首选方法是什么?这甚至应该是一个后处理步骤,还是首先在写入数据帧之前对其进行过滤?我的想法是,在数据框对象中操作一次会更容易。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用isin 并传递要搜索的术语列表,然后可以使用~ 否定布尔掩码,这将过滤掉这些行:

    In [6]:
    
    to_drop = ['Clerk', 'Bagger']
    df[~df['title'].isin(to_drop)]
    Out[6]:
      fName  lName             email title
    0  John  Smith  jsmith@gmail.com   CEO
    

    另一种方法是加入术语,使其成为正则表达式并使用矢量化str.contains:

    In [8]:
    
    df[~df['title'].str.contains('|'.join(to_drop))]
    Out[8]:
      fName  lName             email title
    0  John  Smith  jsmith@gmail.com   CEO
    

    IMO 将过滤作为后处理步骤执行会更容易并且可能更快,因为如果您决定在阅读时进行过滤,那么您将迭代地增长数据帧,这是无效的。

    或者,您可以分块读取 csv,过滤掉不需要的行并将块附加到输出 csv

    【讨论】:

    • 也许使用一个集合会是一个想法?
    • @PadraicCunningham 你的意思是搜索词列表,我猜是这样,但我希望 OP 提供一个唯一词列表,除非你指的是别的东西
    • 是的,用于名称列表。
    • 对此的评论很少,这可能来自我提出问题的方式。我真的很希望代码删除标题文本中包含 to_drop 中的术语的任何内容。因此,例如,如果 to_drop 碰巧包含“Bag”,它将删除第 1 行。如何修改以进行松散匹配?
    • 我不明白答案的第二部分:“另一种方法是加入术语,使其成为正则表达式并使用矢量化str.contains”:不是使用join 会发生什么。
    【解决方案2】:

    使用query的另一种方式

    In [961]: to_drop = ['Clerk', 'Bagger']
    
    In [962]: df.query('title not in @to_drop')
    Out[962]:
      fName  lName             email title
    0  John  Smith  jsmith@gmail.com   CEO
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 2019-02-14
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      相关资源
      最近更新 更多