Làm cách nào để triển khai 'trong' và 'không trong' cho DataFrame của gấu trúc?
Pandas cung cấp hai phương thức: Series.isin
và DataFrame.isin
cho Series và DataFrames, tương ứng.
Lọc DataFrame dựa trên MỘT Cột (cũng áp dụng cho Sê-ri)
Kịch bản phổ biến nhất là áp dụng một isin
điều kiện trên một cột cụ thể để lọc các hàng trong DataFrame.
df = pd.DataFrame({'countries': ['US', 'UK', 'Germany', np.nan, 'China']})
df
countries
0 US
1 UK
2 Germany
3 China
c1 = ['UK', 'China'] # list
c2 = {'Germany'} # set
c3 = pd.Series(['China', 'US']) # Series
c4 = np.array(['US', 'UK']) # array
Series.isin
chấp nhận các loại khác nhau như đầu vào. Sau đây là tất cả các cách hợp lệ để có được những gì bạn muốn:
df['countries'].isin(c1)
0 False
1 True
2 False
3 False
4 True
Name: countries, dtype: bool
# `in` operation
df[df['countries'].isin(c1)]
countries
1 UK
4 China
# `not in` operation
df[~df['countries'].isin(c1)]
countries
0 US
2 Germany
3 NaN
# Filter with `set` (tuples work too)
df[df['countries'].isin(c2)]
countries
2 Germany
# Filter with another Series
df[df['countries'].isin(c3)]
countries
0 US
4 China
# Filter with array
df[df['countries'].isin(c4)]
countries
0 US
1 UK
Lọc trên NHIỀU Cột
Đôi khi, bạn sẽ muốn áp dụng kiểm tra thành viên 'trong' với một số cụm từ tìm kiếm trên nhiều cột,
df2 = pd.DataFrame({
'A': ['x', 'y', 'z', 'q'], 'B': ['w', 'a', np.nan, 'x'], 'C': np.arange(4)})
df2
A B C
0 x w 0
1 y a 1
2 z NaN 2
3 q x 3
c1 = ['x', 'w', 'p']
Để áp dụng isin
điều kiện cho cả hai cột "A" và "B", hãy sử dụng DataFrame.isin
:
df2[['A', 'B']].isin(c1)
A B
0 True True
1 False False
2 False False
3 False True
Từ đó, để giữ lại các hàng có ít nhất một cộtTrue
, chúng ta có thể sử dụng any
dọc theo trục đầu tiên:
df2[['A', 'B']].isin(c1).any(axis=1)
0 True
1 False
2 False
3 True
dtype: bool
df2[df2[['A', 'B']].isin(c1).any(axis=1)]
A B C
0 x w 0
3 q x 3
Lưu ý rằng nếu bạn muốn tìm kiếm mọi cột, bạn chỉ cần bỏ qua bước chọn cột và thực hiện
df2.isin(c1).any(axis=1)
Tương tự, để giữ lại các hàng trong đó TẤT CẢ các cộtTrue
, hãy sử dụng all
theo cách tương tự như trước đây.
df2[df2[['A', 'B']].isin(c1).all(axis=1)]
A B C
0 x w 0
Các đề cập đáng chú ý: numpy.isin
,, query
danh sách hiểu (chuỗi dữ liệu)
Ngoài các phương pháp được mô tả ở trên, bạn cũng có thể sử dụng tương đương numpy: numpy.isin
.
# `in` operation
df[np.isin(df['countries'], c1)]
countries
1 UK
4 China
# `not in` operation
df[np.isin(df['countries'], c1, invert=True)]
countries
0 US
2 Germany
3 NaN
Tại sao nó đáng để xem xét? Các hàm NumPy thường nhanh hơn một chút so với tương đương gấu trúc của chúng vì chi phí thấp hơn. Vì đây là một hoạt động theo nguyên tố không phụ thuộc vào căn chỉnh chỉ mục, nên có rất ít tình huống trong đó phương pháp này không phải là sự thay thế thích hợp cho gấu trúc 'isin
.
Các thường trình gấu trúc thường lặp đi lặp lại khi làm việc với các chuỗi, bởi vì các thao tác chuỗi rất khó để vectorise. Có rất nhiều bằng chứng cho thấy rằng việc hiểu danh sách sẽ nhanh hơn ở đây. . Chúng tôi sử dụng một in
kiểm tra ngay bây giờ.
c1_set = set(c1) # Using `in` with `sets` is a constant time operation...
# This doesn't matter for pandas because the implementation differs.
# `in` operation
df[[x in c1_set for x in df['countries']]]
countries
1 UK
4 China
# `not in` operation
df[[x not in c1_set for x in df['countries']]]
countries
0 US
2 Germany
3 NaN
Tuy nhiên, việc chỉ định sẽ khó sử dụng hơn rất nhiều, vì vậy, đừng sử dụng nó trừ khi bạn biết bạn đang làm gì.
Cuối cùng, cũng DataFrame.query
có câu trả lời trong câu trả lời này . FTexpr FTW!