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