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

Sid*_*ess 11 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   Schmo      jschmo@business.com  Bagger
2  Some  Person  some.person@hotmail.com   Clerk
Run Code Online (Sandbox Code Playgroud)

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

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")
Run Code Online (Sandbox Code Playgroud)

在熊猫中这样做的首选方式是什么?这应该是一个后处理步骤,还是首先在写入数据帧之前对其进行过滤?我的想法是,在数据框架对象中操作一次会更容易.

EdC*_*ica 29

使用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
Run Code Online (Sandbox Code Playgroud)

另一种方法是加入这些术语,使其成为正则表达式并使用矢量化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
Run Code Online (Sandbox Code Playgroud)

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

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