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