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

时间:2015-07-27 21:13:34

标签: python pandas

我有一个.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")

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

2 个答案:

答案 0 :(得分:27)

使用BindingList<T>并传递您的术语列表以进行搜索,然后使用~取消布尔掩码,这将过滤掉这些行:

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

另一种方法是加入这些术语,使其成为正则表达式并使用矢量化isin

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

答案 1 :(得分:1)

使用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