我有一个.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")
在熊猫中这样做的首选方法是什么?这应该是一个后处理步骤,还是首先在写入数据帧之前对其进行过滤?我的想法是,在数据框对象中操作一次会更容易。
答案 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