Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/Pandas:从列表中的字符串匹配上的数据框中删除行_Python_Pandas - Fatal编程技术网

Python/Pandas:从列表中的字符串匹配上的数据框中删除行

Python/Pandas:从列表中的字符串匹配上的数据框中删除行,python,pandas,Python,Pandas,我有一个.csv文件的联系信息,我作为熊猫数据框导入 >>> 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 Sc

我有一个.csv文件的联系信息,我作为熊猫数据框导入

>>> 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")
在熊猫身上这样做的首选方式是什么?这甚至应该是一个后处理步骤,还是最好在写入数据帧之前对其进行过滤?我的想法是,这将更容易在数据框对象中操作一次。

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

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
另一种方法是加入术语,使其成为正则表达式,并使用矢量化:

在我看来,作为后处理步骤执行过滤会更容易,也可能更快,因为如果您决定在读取时进行过滤,那么您将迭代地增加数据帧,这是不高效的


或者,您可以分块读取csv,过滤掉不需要的行,并使用
查询
以另一种方式将分块附加到输出csv中

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

也许使用集合是个好主意?@PadraicCunningham你的意思是搜索词列表,我想是的,但我希望OP能提供一个独特的词列表,除非你指的是其他的东西,意思是名称列表。对此有点小评论,可能是我用词的方式。我真的希望代码删除标题文本中包含to_drop中的任何术语。例如,如果to_drop碰巧包含“Bag”,它将删除第1行。如何修改以进行松散匹配?我不理解答案的第二部分:“另一种方法是连接术语,使其成为正则表达式并使用向量化的
str.contains
”:使用
连接时不会发生这种情况。
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