Trong các bài trước về pandas, tôi đã giới thiệu các cách truy nhập tự nhiên cho dataframe hay series, có thể nhận thấy rằng chúng rất tương đồng với cách truy cập mảng, list hay dictionary.
Trong phần này tôi sẽ hướng dẫn các kĩ thuật filtering để có thể select một phần dữ liệu trong Dataframe dựa vào nội dung của dữ liệu chứ không chỉ dựa vào index hay label như các bài trước.
.where[]
Việc select các giá trị từ một Series với một Filter [véc tơ boolean] thường trả về một tập con của dữ liệu. Để đảm bảo rằng đầu ra của select có cùng hình dạng với dữ liệu ban đầu, bạn có thể sử dụng phương thức where trong Series và Dataframe. Ví dụ:
>>> s = pd.Series[[12,34,56,78],index = [1,2,3,4]]
>>> s
1 12
2 34
3 56
4 78
dtype: int64
>>> s>50
1 False
2 False
3 True
4 True
dtype: bool
>>> s[s>50]
3 56
4 78
dtype: int64
>>> s.where[s>50]
1 NaN
2 NaN
3 56.0
4 78.0
dtype: float64
>>>
Select các giá trị từ một dataframe khi truyền vào một Filter [Boolean vector] bây giờ cũng bảo tồn hình dạng dữ liệu đầu vào. “where” được sử dụng trong ví dụ dưới đây cho kết quả tương đương.
>>> df = pd.DataFrame[np.random.randn[5, 4]*100,columns = list["ABCD"]]
>>> df
A B C D
0 102.502787 -68.034861 215.551919 -39.416507
1 89.068861 30.578270 -169.886261 32.943052
2 26.351777 -88.681893 42.678767 51.788262
3 -28.990230 8.767649 -5.079649 106.257066
4 -163.709170 -87.866018 43.412728 -22.622010
>>> df[df>0]
A B C D
0 102.502787 NaN 215.551919 NaN
1 89.068861 30.578270 NaN 32.943052
2 26.351777 NaN 42.678767 51.788262
3 NaN 8.767649 NaN 106.257066
4 NaN NaN 43.412728 NaN
>>> df.where[df>0]
A B C D
0 102.502787 NaN 215.551919 NaN
1 89.068861 30.578270 NaN 32.943052
2 26.351777 NaN 42.678767 51.788262
3 NaN 8.767649 NaN 106.257066
4 NaN NaN 43.412728 NaN
>>>
Tuy nhiên, trong trường hợp dùng “where”có một đối số tùy chọn khác để thay thế các giá trị mà điều kiện là False, trong bản sao được trả về.
>>> df.where[df>0,-df]
A B C D
0 102.502787 68.034861 215.551919 39.416507
1 89.068861 30.578270 169.886261 32.943052
2 26.351777 88.681893 42.678767 51.788262
3 28.990230 8.767649 5.079649 106.257066
4 163.709170 87.866018 43.412728 22.622010
>>>
Chú ý, tùy chọn inplace=True giúp where chỉnh sửa tại chỗ dataframe đang query.
.query[expr, inplace=False, **kwargs]
Các đối tượng dataframe có một phương thức query[] cho phép select dữ liệu thông qua việc sử dụng một biểu thức.
Bạn có thể lấy giá trị của dataframe mà cột b có các giá trị nằm giữa các giá trị của các cột a và c. Ví dụ sau đây sẽ trình bày 2 cách cho cùng một kết quả trả về. Cách một dùng cú pháp giống numy thông thường, cách còn lại dùng theo cú pháp sql.
>>> df = pd.DataFrame[np.random.randint[100, size=[10, 3]], columns=list['abc']]
>>> df
a b c
0 51 91 35
1 57 12 91
2 40 64 16
3 30 36 28
4 11 69 89
5 96 7 72
6 66 20 44
7 85 16 29
8 16 12 21
9 80 48 91
>>> df[[df.a < df.b] & [df.b < df.c]]
a b c
4 11 69 89
>>> print["cach lam tuong duong khi dung query"]
cach lam tuong duong khi dung query
>>> df.query['a < b and b < c']
a b c
4 11 69 89
>>>
Trường hợp sử dụng query[] là khi bạn có một tập hợp dataframe có một tập con của các tên cột [hoặc các level chỉ mục /tên] chung. Bạn có dùng cùng một truy vấn cho cả hai dataframes mà không cần phải chỉ định dataframe mà bạn quan tâm đến việc truy vấn. Ví dụ:
>>> df = pd.DataFrame[np.random.randint[100,size = [5, 3]], columns=list['abc']]
>>> df1 = pd.DataFrame[np.random.randint[100,size=[8, 3]], columns=df.columns]
>>> expr = '0.0