giảm các hàng khỏi khung dữ liệu dựa trên tình trạng “không ở trong” [trùng lặp]


97

Tôi muốn giảm các hàng khỏi khung dữ liệu gấu trúc khi giá trị của cột ngày nằm trong danh sách ngày. Mã sau không hoạt động:

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

df=df[df.datecolumn not in a]

Tôi nhận được lỗi sau đây:

ValueError: Giá trị sự thật của Chuỗi không rõ ràng. Sử dụng a.empty, a.bool (), a.item (), a.any () hoặc a.all ().

Câu trả lời:


180

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

pandas.Dateframe.isinsẽ trả về giá trị boolean tùy thuộc vào việc mỗi phần tử có bên trong danh sách ahay không. Sau đó, bạn đảo ngược điều này với ~để chuyển đổi Truethành Falsevà 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

7
Bạn có thể có nghĩa là Series.isin, không phải DataFrame.isin. Bạn đang so sánh cho một cột, không phải toàn bộ df.
Acumenus

33

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

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

Trong khi thông báo lỗi cho thấy rằng all() hoặc any()có thể được sử dụng, nhưng chúng chỉ hữu í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 bây giờ, đó là kiểm tra tư cách thành viên của mọi giá trị trong Chuỗi so với danh sách bên ngoài và giữ nguyên kết quả (tức là Chuỗi Boolean sau đó sẽ được sử dụng để cắt DataFrame ban đầu ).

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.