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
-
df[['state']]
sẽ trả vềDataFrame
trong khidf['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ủaindex
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ạngbool
-
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
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
-
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ỗiKeyError: "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
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
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
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
-
.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
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