2015-07-27 26 views
7

Tôi có tệp .csv của thông tin liên hệ mà tôi nhập dưới dạng khung dữ liệu gấu trúc.Python/Pandas: Thả các hàng từ khung dữ liệu trên kết hợp chuỗi từ danh sách

>>> import pandas as pd 
>>> 
>>> df = pd.read_csv('data.csv') 
>>> df.head() 

    fName lName     email title 
0 John Smith   [email protected]  CEO 
1 Joe Schmo  [email protected] Bagger 
2 Some Person [email protected] Clerk 

Sau khi nhập dữ liệu, tôi muốn thả các hàng trong đó một trường chứa một vài đoạn trong một danh sách. Ví dụ:

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") 

Cách ưa thích để làm điều này trong Pandas là gì? Liệu đây có phải là một bước hậu xử lý hay không, liệu có nên lọc nó trước khi ghi vào khung dữ liệu ngay từ đầu không? Tôi nghĩ rằng điều này sẽ dễ dàng hơn để thao tác một lần trong một đối tượng khung dữ liệu.

+0

http: // chrisalbon. com/python/pandas_drop_column_containing_certain_string.html kiểm tra điều này ra – FirebladeDan

Trả lời

17

Sử dụng isin và vượt qua danh sách thuật ngữ để tìm kiếm bạn có thể phủ nhận mặt nạ boolean sử dụng ~ và điều này sẽ lọc ra những hàng:

In [6]: 

to_drop = ['Clerk', 'Bagger'] 
df[~df['title'].isin(to_drop)] 
Out[6]: 
    fName lName    email title 
0 John Smith [email protected] CEO 

phương pháp khác là để tham gia các điều khoản này để nó trở thành một regex và sử dụng vectorised str.contains:

In [8]: 

df[~df['title'].str.contains('|'.join(to_drop))] 
Out[8]: 
    fName lName    email title 
0 John Smith [email protected] CEO 

IMO nó sẽ được dễ dàng hơn và có lẽ nhanh hơn để thực hiện các bộ lọc như là một bước bài chế biến vì nếu bạn quyết định để lọc khi đọc thì bạn là tôi phát triển dataframe một cách nhanh chóng và không hiệu quả.

Hoặc bạn có thể đọc các csv trong khối, lọc ra các hàng bạn không muốn và thêm các khối để csv đầu ra của bạn

+0

Có thể sử dụng một tập hợp sẽ là một ý tưởng? –

+0

@PadraicCunningham bạn có nghĩa là cho danh sách các cụm từ tìm kiếm, tôi đoán vậy nhưng tôi đã hy vọng OP cung cấp danh sách các thuật ngữ duy nhất trừ khi bạn đang đề cập đến một cái gì đó khác – EdChum

+0

Đúng, có nghĩa là danh sách tên. –

1

Một cách khác để sử dụng 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 [email protected] CEO 
Các vấn đề liên quan