Chắc chắn rồi! Thiết lập:
>>> import pandas as pd
>>> from random import randint
>>> df = pd.DataFrame({'A': [randint(1, 9) for x in range(10)],
'B': [randint(1, 9)*10 for x in range(10)],
'C': [randint(1, 9)*100 for x in range(10)]})
>>> df
A B C
0 9 40 300
1 9 70 700
2 5 70 900
3 8 80 900
4 7 50 200
5 9 30 900
6 2 80 700
7 2 80 400
8 5 80 300
9 7 70 800
Chúng ta có thể áp dụng các hoạt động cột và nhận các đối tượng Sê-ri boolean:
>>> df["B"] > 50
0 False
1 True
2 True
3 True
4 False
5 False
6 True
7 True
8 True
9 True
Name: B
>>> (df["B"] > 50) & (df["C"] == 900)
0 False
1 False
2 True
3 True
4 False
5 False
6 False
7 False
8 False
9 False
[Cập nhật, để chuyển sang kiểu mới .loc
]:
Và sau đó chúng ta có thể sử dụng chúng để lập chỉ mục vào đối tượng. Để truy cập đọc, bạn có thể xâu chuỗi các chỉ số:
>>> df["A"][(df["B"] > 50) & (df["C"] == 900)]
2 5
3 8
Name: A, dtype: int64
nhưng bạn có thể gặp rắc rối vì sự khác biệt giữa chế độ xem và bản sao thực hiện việc này để truy cập ghi. Bạn có thể sử dụng .loc
thay thế:
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"]
2 5
3 8
Name: A, dtype: int64
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"].values
array([5, 8], dtype=int64)
>>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"] *= 1000
>>> df
A B C
0 9 40 300
1 9 70 700
2 5000 70 900
3 8000 80 900
4 7 50 200
5 9 30 900
6 2 80 700
7 2 80 400
8 5 80 300
9 7 70 800
Lưu ý rằng tôi đã vô tình gõ == 900
và không != 900
, hoặc ~(df["C"] == 900)
, nhưng tôi quá lười để sửa nó. Bài tập cho người đọc. : ^)
df.query
vàpd.eval
có vẻ như phù hợp với trường hợp sử dụng này. Để biết thông tin vềpd.eval()
họ các hàm, tính năng và trường hợp sử dụng của chúng, vui lòng truy cập Đánh giá biểu thức động trong gấu trúc bằng pd.eval () .