我有一个.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中。