2015-01-15 4237 views
16

Tôi muốn thả hàng từ một dataframe gấu trúc khi giá trị của cột ngày nằm trong một danh sách các ngày. Các mã sau đây không làm việc:hàng giảm từ dataframe dựa trên một "không" điều kiện

a=['2015-01-01' , '2015-02-01'] 

df=df[df.datecolumn not in a] 

tôi nhận được lỗi sau:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Trả lời

19

Bạn có thể sử dụng pandas.Dataframe.isin.

pandas.Dateframe.isin sẽ trả về giá trị boolean tùy thuộc vào việc mỗi phần tử có nằm trong danh sách a hay không. Sau đó bạn đảo ngược này với ~ để chuyển đổi True-False và ngược lại.

import pandas as pd 

a = ['2015-01-01' , '2015-02-01'] 

df = pd.DataFrame(data={'date':['2015-01-01' , '2015-02-01', '2015-03-01' , '2015-04-01', '2015-05-01' , '2015-06-01']}) 

print(df) 
#   date 
#0 2015-01-01 
#1 2015-02-01 
#2 2015-03-01 
#3 2015-04-01 
#4 2015-05-01 
#5 2015-06-01 

df = df[~df['date'].isin(a)] 

print(df) 
#   date 
#2 2015-03-01 
#3 2015-04-01 
#4 2015-05-01 
#5 2015-06-01 
+0

nó hoạt động .. cảm ơn bạn –

8

Bạn có thể sử dụng isin:

df = df[~df.datecolumn.isin(a)] 

Trong khi thông báo lỗi cho thấy rằng all() hoặc any() thể được sử dụng, họ chỉ có ích khi bạn muốn giảm kết quả thành một giá trị Boolean duy nhất. Tuy nhiên đó không phải là những gì bạn đang cố gắng để làm gì bây giờ, mà là để kiểm tra tư cách thành viên của tất cả các giá trị trong Series so với danh sách bên ngoài, và giữ cho kết quả còn nguyên vẹn (ví dụ, một Series Boolean mà sau đó sẽ được sử dụng để cắt các DataFrame gốc).

Bạn có thể đọc thêm về điều này trong Gotchas.

+0

Nó hoạt động .. Cảm ơn bạn –

Các vấn đề liên quan