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

在大熊猫中,最好的方法是什么?这是否应该是一个后处理步骤,或者在第一时间写入数据帧之前,最好对其进行过滤?我的想法是,在一个数据帧对象中,这一点很容易操作一次。

最佳答案

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

另一种方法是加入术语,使其成为regex并使用矢量化的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中。

09-06 07:53
查看更多