Nhảy tới nội dung

Chọn dữ liệu

Chọn dữ liệu dùng []

Cú pháp [] là cú pháp đơn giản nhất để lấy bảng con của 1 bảng cho trước. Với 1 df là 1 DataFrame có index là region và dữ liệu như sau

                         state  individuals  family_members  state_pop
region
East South Central Alabama 2570.0 864.0 4887681
Pacific Alaska 1434.0 582.0 735139
Mountain Arizona 7259.0 2606.0 7158024
West South Central Arkansas 2280.0 432.0 3009733
Pacific California 109008.0 20964.0 39461588
Mountain Colorado 7607.0 3250.0 5691287

Để chọn 1 bảng con có 2 cột ['state', 'family_members'] ta làm như sau

df[['state', 'family_members']]
                         state  family_members
region
East South Central Alabama 864.0
Pacific Alaska 582.0
Mountain Arizona 2606.0
West South Central Arkansas 432.0
Pacific California 20964.0
Mountain Colorado 3250.0

Để lấy theo dòng ta dùng tương tự Series

df[:3]
                      state  individuals  family_members  state_pop
region
East South Central Alabama 2570.0 864.0 4887681
Pacific Alaska 1434.0 582.0 735139
Mountain Arizona 7259.0 2606.0 7158024

df[2:5]
                         state  individuals  family_members  state_pop
region
Mountain Arizona 7259.0 2606.0 7158024
West South Central Arkansas 2280.0 432.0 3009733
Pacific California 109008.0 20964.0 39461588
Lưu ý
  • df[['state']] sẽ trả về DataFrame trong khi df['state'] trả về Series.

  • Đối với lấy theo dòng, [] không lấy được theo dòng riêng biệt.

  • [] chỉ lấy dữ liệu theo dòng hoặc cột, không thực hiện được cùng lúc cả hai thao tác.

Ví dụ khi gọi df[3] hay df[[1, 2, 3]] sẽ báo lỗi KeyError

df[3]
KeyError

Chọn dữ liệu dùng .loc

Phương thức .loc dùng để lấy dữ liệu theo cột hoặc hàng dựa theo nhãn định sẵn (Tên hàng, tên cột), ngoài ra .loc còn nhận các giá trị boolean.

Đầu vào của .loc có thể gồm:

  • Nhãn đơn: là 1 số 3 hoặc dạng chữ a, lưu ý rằng số này là nhãn của index chứ không phải vị trí của dòng.

  • Danh sách các nhãn : ['a', 'b', 'c']

  • Đối tượng dạng slice ví dụ 'a':'e'

  • Danh sách kiểu bool có độ dài bằng với số lượng dòng

  • Series dạng bool

  • pd.Index

Sử dụng nhãn đơn, kết quả trả về là các dòng có nhãn giống như nhãn trong .loc

df.loc['Pacific']
              state  individuals  family_members  state_pop
region
Pacific Alaska 1434.0 582.0 735139
Pacific California 109008.0 20964.0 39461588
Lưu ý

Khi kết quả là nhiều dòng thì dữ liệu trả về có kiểu DataFrame, trong khi nếu chỉ có 1 dòng duy nhất thì kết quả trả về sẽ theo kiểu Series

type(df.loc['Pacific'])
<class 'pandas.core.frame.DataFrame'>
type(df.loc['West South Central'])
<class 'pandas.core.series.Series'>

Khi đưa danh sách các nhãn dùng .loc[[]] thì nhãn đưa vào là nhãn của index. Nếu đưa tên các cột sẽ bị báo lỗi KeyError

df.loc[['Pacific', 'Mountain']]
               state  individuals  family_members  state_pop
region
Pacific Alaska 1434.0 582.0 735139
Pacific California 109008.0 20964.0 39461588
Mountain Arizona 7259.0 2606.0 7158024
Mountain Colorado 7607.0 3250.0 5691287

Để lấy nhãn đơn theo nhãn của index và tên column ta truyền vào phần nhãn của index trước và nhãn của column sau và phân biệt bởi dấu phẩy

df.loc['Pacific', 'state']
region
Pacific Alaska
Pacific California
Name: state, dtype: object

Để lấy nhiều hơn 1 nhãn của index hoặc nhiều hơn 1 nhãn của column ta chỉ cần thay thế nhãn đơn của index thành danh sách hoặc slice, tương tự ta có thế thay thế nhãn đơn thành danh sách hoặc slice của column

df.loc['Pacific', ['individuals', 'family_members']])
         individuals  family_members
region
Pacific 1434.0 582.0
Pacific 109008.0 20964.0
df.loc['Pacific', 'individuals':'state_pop']
         individuals  family_members  state_pop
region
Pacific 1434.0 582.0 735139
Pacific 109008.0 20964.0 39461588
Lưu ý
  • Dùng slice sẽ lấy theo thứ tự xuất hiện chứ không lấy theo thứ tự sắp xếp từ điển, như ví dụ trên thì mặc dù family_members > individuals nhưng vẫn xếp sau.

  • Slice không áp dụng được cho index có nhãn trùng nhau, nếu dùng sẽ báo lỗi KeyError: "Cannot get right slice bound for non-unique label:

Danh sách dạng boolean, chỉ sử dụng cho index, không dùng cho column

df.loc[[False, True, False, True, False, False]]
                       state  individuals  family_members  state_pop
region
Pacific Alaska 1434.0 582.0 735139
West South Central Arkansas 2280.0 432.0 3009733

Series boolean

s = pd.Series([False, True, False, True, False, False],
index=['East South Central', 'Pacific', 'Mountain', 'West South Central', 'Pacific', 'Mountain'])
df.loc[s]
                       state  individuals  family_members  state_pop
region
Pacific Alaska 1434.0 582.0 735139
West South Central Arkansas 2280.0 432.0 3009733

pd.Index

df.loc[pd.Index(["Pacific", "East South Central"], name="meow")]
                         state  individuals  family_members  state_pop
meow
Pacific Alaska 1434.0 582.0 735139
Pacific California 109008.0 20964.0 39461588
East South Central Alabama 2570.0 864.0 4887681

Select với MultiIndex

                     individuals  family_members  state_pop
region state
Mountain Arizona 7259.0 2606.0 7158024
Colorado 7607.0 3250.0 5691287
Idaho 1297.0 715.0 1750536
Pacific Alaska 1434.0 582.0 735139
California 109008.0 20964.0 39461588
Hawaii 4131.0 2399.0 1420593

Với nhãn đơn

df.loc['Mountain']
          individuals  family_members  state_pop
state
Arizona 7259.0 2606.0 7158024
Colorado 7607.0 3250.0 5691287
Idaho 1297.0 715.0 1750536
**_Lưu ý:_** 
Với `MultiIndex`,các index sẽ xếp theo thứ tự từ level 0 đến n (`level 0` cao hơn `level 1` ...), với nhãn đơn là nhãn của 1 `index` thì chỉ thực hiện được index level đầu tiên, các index level sau sẽ báo lỗi.
Theo như ví dụ trên thì `region` có level cao hơn 'state' nên chỉ gọi được `.loc['Mountain']` còn `.loc['Arizona']` sẽ báo lỗi

Để select nhiều index cùng lúc, ta truyền vào tuple(label1, label2...) theo thứ tự index có level từ cao đến thấp

df.loc[('Mountain', 'Colorado')]
individuals          7607.0
family_members 3250.0
state_pop 5691287.0
Name: (Mountain, Colorado), dtype: float64

Tương tự ta cùng có select theo các column cho trước

df.loc[('Mountain', 'Colorado'), ['individuals', 'family_members']]
individuals       7607.0
family_members 3250.0
Name: (Mountain, Colorado), dtype: float64
Mẹo

Có thể select index ở các level sau bằng cách dùng slice

df.loc[(slice(None), 'Arizona'), :]
                  individuals  family_members  state_pop
region state
Mountain Arizona 7259.0 2606.0 7158024

Slice cho MultiIndex

Slice từ 1 tuple nhãn đến một nhãn đơn

df.loc[('Mountain', 'Colorado'):'Pacific']
                     individuals  family_members  state_pop
region state
Mountain Colorado 7607.0 3250.0 5691287
Idaho 1297.0 715.0 1750536
Pacific Alaska 1434.0 582.0 735139
California 109008.0 20964.0 39461588
Hawaii 4131.0 2399.0 1420593
Lưu ý

Nhãn đơn phía sau phải có cùng level với nhãn đầu tiên trong tuple. Trong ví dụ trên nếu thay Pacific thành Hawaii sẽ trả về rỗng. Nhưng khi truyền nhãn không nằm trong các nhãn của index thì vẫn có kết quả trả về

df.loc[('Mountain', 'Colorado'): 'meow']
                     individuals  family_members  state_pop
region state
Mountain Colorado 7607.0 3250.0 5691287
Idaho 1297.0 715.0 1750536
Pacific Alaska 1434.0 582.0 735139
California 109008.0 20964.0 39461588
Hawaii 4131.0 2399.0 1420593

Slice từ 1 tuple nhãn đến một tuple nhãn

df.loc[('Mountain', 'Colorado'):('Pacific', 'California')]
                     individuals  family_members  state_pop
region state
Mountain Colorado 7607.0 3250.0 5691287
Idaho 1297.0 715.0 1750536
Pacific Alaska 1434.0 582.0 735139
California 109008.0 20964.0 39461588

Chọn dữ liệu dùng .iloc

Phương thức .iloc dùng để lấy dữ liệu theo cột hoặc hàng dựa theo index của nó, ngoài ra .iloc còn nhận các giá trị boolean.

Đầu vào của .iloc có thể gồm:

  • Nhãn đơn: là 1 số 3

  • Danh sách các số : [1, 2, 3]

  • Đối tượng dạng slice ví dụ 1:5

  • Danh sách kiểu bool có độ dài bằng với số lượng dòng

Ví dụ với DataFrame

                         state  individuals  family_members  state_pop
region
East South Central Alabama 2570.0 864.0 4887681
Pacific Alaska 1434.0 582.0 735139
Mountain Arizona 7259.0 2606.0 7158024
West South Central Arkansas 2280.0 432.0 3009733
Pacific California 109008.0 20964.0 39461588
Mountain Colorado 7607.0 3250.0 5691287

Khi truyền 1 giá trị nguyên, .iloc trả về giá trị của dòng tại vị trí truyền vào với kiểu Series

df.iloc[0]
state             Alabama
individuals 2570.0
family_members 864.0
state_pop 4887681
Name: East South Central, dtype: object
Lưu ý

Series trả về không chứa nhãn của index, ở đây là nhãn East South Central của index region

Để lấy dữ liệu theo cột, ví dụ muốn lấy cột family_members thì sẽ truyền index cột là 2

df.iloc[:, 2]
region
East South Central 864.0
Pacific 582.0
Mountain 2606.0
West South Central 432.0
Pacific 20964.0
Mountain 3250.0
Name: family_members, dtype: float64
Mẹo
  • .iloc bắt buộc truyền vào vị trí của cột, không cho phép tên cột.

  • Sử dụng .columns.get_loc(<tên cột>) để lấy vị trí của cột

df.iloc[:, df.columns.get_loc('family_members')]
region
East South Central 864.0
Pacific 582.0
Mountain 2606.0
West South Central 432.0
Pacific 20964.0
Mountain 3250.0
Name: family_members, dtype: float64

Select theo danh sách, mặc định đưa vào 1 danh sách Pandas sẽ hiểu là lấy theo các dòng

df.iloc[[1, 3 ,5]]
                   individuals  family_members  state_pop
region state
Mountain Colorado 7607.0 3250.0 5691287
Pacific Alaska 1434.0 582.0 735139
Hawaii 4131.0 2399.0 1420593
Mẹo

Dòng lệnh trên cũng tương đương với df.iloc[[1, 3 ,5], :], trong đó : dùng để lấy toàn bộ

Tương tự để lấy theo danh sách index các cột

df.iloc[:, [0, 2]]
                     individuals  state_pop
region state
Mountain Arizona 7259.0 7158024
Colorado 7607.0 5691287
Idaho 1297.0 1750536
Pacific Alaska 1434.0 735139
California 109008.0 39461588
Hawaii 4131.0 1420593

Slice cả 2 chiều

df.iloc[2:4, 0:2]
                 individuals  family_members
region state
Mountain Idaho 1297.0 715.0
Pacific Alaska 1434.0 582.0

Sử dụng danh sách các boolean

# Theo dòng
df.iloc[[True, False, True, False, False, True], :]
                  individuals  family_members  state_pop
region state
Mountain Arizona 7259.0 2606.0 7158024
Idaho 1297.0 715.0 1750536
Pacific Hawaii 4131.0 2399.0 1420593
df.iloc[:, [False, True,False]]
                     family_members
region state
Mountain Arizona 2606.0
Colorado 3250.0
Idaho 715.0
Pacific Alaska 582.0
California 20964.0
Hawaii 2399.0