Hướng dẫn dùng df.loc pandas python

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 

Chủ Đề