Theo tôi, câu trả lời được chấp nhận là khó hiểu, vì nó sử dụng DataFrame chỉ có các giá trị bị thiếu. Tôi cũng không thích thuật ngữ vị trí dựa trên cho .iloc
và thay vào đó, thích nguyên vị trí như nó có nhiều tính mô tả hơn và chính xác những gì .iloc
là viết tắt của. Từ khóa là INTEGER - .iloc
cần INTEGERS.
Xem loạt blog cực kỳ chi tiết của tôi về lựa chọn tập hợp con để biết thêm
.ix không dùng nữa và không rõ ràng và không bao giờ được sử dụng
Bởi vì .ix
không được chấp nhận, chúng tôi sẽ chỉ tập trung vào sự khác biệt giữa .loc
và .iloc
.
Trước khi chúng ta nói về sự khác biệt, điều quan trọng là phải hiểu rằng DataFrames có nhãn giúp xác định từng cột và từng chỉ mục. Chúng ta hãy xem một DataFrame mẫu:
df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
'height':[165, 70, 120, 80, 180, 172, 150],
'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
},
index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])
Tất cả các từ in đậm là nhãn. Các nhãn, age
, color
, food
, height
, score
và state
được sử dụng cho các cột . Các nhãn khác, Jane
, Nick
, Aaron
, Penelope
, Dean
, Christina
, Cornelia
được sử dụng cho các chỉ số .
Các cách chính để chọn các hàng cụ thể trong DataFrame là với .loc
và .iloc
bộ chỉ mục. Mỗi trong số các chỉ mục này cũng có thể được sử dụng để chọn đồng thời các cột nhưng bây giờ việc tập trung vào các hàng sẽ dễ dàng hơn. Ngoài ra, mỗi người lập chỉ mục sử dụng một bộ dấu ngoặc ngay lập tức theo tên của họ để đưa ra lựa chọn của họ.
.loc chỉ chọn dữ liệu theo nhãn
Trước tiên chúng ta sẽ nói về bộ .loc
chỉ mục chỉ chọn dữ liệu theo nhãn chỉ mục hoặc cột. Trong DataFrame mẫu của chúng tôi, chúng tôi đã cung cấp các tên có ý nghĩa làm giá trị cho chỉ mục. Nhiều DataFrames sẽ không có bất kỳ tên có ý nghĩa nào và thay vào đó, mặc định chỉ là các số nguyên từ 0 đến n-1, trong đó n là độ dài của DataFrame.
Có ba đầu vào khác nhau mà bạn có thể sử dụng cho .loc
- Một chuỗi
- Một danh sách các chuỗi
- Ký hiệu lát cắt sử dụng chuỗi làm giá trị bắt đầu và dừng
Chọn một hàng đơn với .loc bằng một chuỗi
Để chọn một hàng dữ liệu, đặt nhãn chỉ mục bên trong dấu ngoặc theo sau .loc
.
df.loc['Penelope']
Điều này trả về hàng dữ liệu dưới dạng Sê-ri
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
Chọn nhiều hàng với .loc với danh sách các chuỗi
df.loc[['Cornelia', 'Jane', 'Dean']]
Điều này trả về một DataFrame với các hàng theo thứ tự được chỉ định trong danh sách:
Chọn nhiều hàng với .loc với ký hiệu lát
Ký hiệu lát được xác định bởi các giá trị bắt đầu, dừng và bước. Khi cắt theo nhãn, gấu trúc bao gồm giá trị dừng trong lợi nhuận. Các lát sau đây từ Aaron đến Dean, bao gồm. Kích thước bước của nó không được xác định rõ ràng nhưng được mặc định là 1.
df.loc['Aaron':'Dean']
Các lát phức tạp có thể được thực hiện theo cách tương tự như danh sách Python.
.iloc chỉ chọn dữ liệu theo vị trí số nguyên
Bây giờ chúng ta hãy chuyển sang .iloc
. Mỗi hàng và cột dữ liệu trong DataFrame có một vị trí số nguyên xác định nó. Đây là ngoài nhãn được hiển thị trực quan ở đầu ra . Vị trí số nguyên chỉ đơn giản là số lượng hàng / cột từ đầu / bên trái bắt đầu từ 0.
Có ba đầu vào khác nhau mà bạn có thể sử dụng cho .iloc
- Một số nguyên
- Danh sách các số nguyên
- Ký hiệu lát cắt sử dụng số nguyên làm giá trị bắt đầu và dừng
Chọn một hàng đơn với .iloc có số nguyên
df.iloc[4]
Điều này trả về hàng thứ 5 (vị trí số nguyên 4) dưới dạng Sê-ri
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
Chọn nhiều hàng với .iloc với danh sách các số nguyên
df.iloc[[2, -2]]
Điều này trả về một DataFrame của hàng thứ ba và thứ hai đến hàng cuối cùng:
Chọn nhiều hàng với .iloc với ký hiệu lát
df.iloc[:5:3]
Lựa chọn đồng thời các hàng và cột với .loc và .iloc
Một khả năng tuyệt vời của cả hai .loc/.iloc
là khả năng chọn đồng thời cả hai hàng và cột. Trong các ví dụ trên, tất cả các cột được trả về từ mỗi lựa chọn. Chúng ta có thể chọn các cột có cùng loại đầu vào như chúng ta làm cho các hàng. Chúng ta chỉ cần phân tách lựa chọn hàng và cột bằng dấu phẩy .
Ví dụ: chúng ta có thể chọn các hàng Jane và Dean chỉ với chiều cao, điểm số và trạng thái như thế này:
df.loc[['Jane', 'Dean'], 'height':]
Điều này sử dụng một danh sách các nhãn cho các hàng và ký hiệu lát cho các cột
Chúng ta có thể tự nhiên thực hiện các hoạt động tương tự với .iloc
chỉ sử dụng số nguyên.
df.iloc[[1,4], 2]
Nick Lamb
Dean Cheese
Name: food, dtype: object
Lựa chọn đồng thời với nhãn và vị trí số nguyên
.ix
đã được sử dụng để thực hiện các lựa chọn đồng thời với nhãn và vị trí số nguyên rất hữu ích nhưng đôi khi khó hiểu và mơ hồ và rất may nó đã bị phản đối. Trong trường hợp bạn cần thực hiện lựa chọn với hỗn hợp nhãn và vị trí số nguyên, bạn sẽ phải tạo cả nhãn lựa chọn hoặc vị trí số nguyên.
Chẳng hạn, nếu chúng ta muốn chọn các hàng Nick
và Cornelia
cùng với cột 2 và 4, chúng ta có thể sử dụng .loc
bằng cách chuyển đổi các số nguyên thành nhãn với các mục sau:
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
Hoặc cách khác, chuyển đổi nhãn chỉ mục thành số nguyên với get_loc
phương thức chỉ mục.
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
Lựa chọn Boolean
Bộ chỉ mục .loc cũng có thể thực hiện lựa chọn boolean. Chẳng hạn, nếu chúng ta quan tâm đến việc tìm tất cả các hàng có độ tuổi trên 30 và chỉ trả về các cột food
và score
chúng ta có thể thực hiện như sau:
df.loc[df['age'] > 30, ['food', 'score']]
Bạn có thể sao chép này với .iloc
nhưng bạn không thể vượt qua nó một loạt boolean. Bạn phải chuyển đổi Boolean Series thành một mảng numpy như thế này:
df.iloc[(df['age'] > 30).values, [2, 4]]
Chọn tất cả các hàng
Có thể sử dụng .loc/.iloc
cho chỉ chọn cột. Bạn có thể chọn tất cả các hàng bằng cách sử dụng dấu hai chấm như thế này:
df.loc[:, 'color':'score':2]
Toán tử lập chỉ mục []
, cũng có thể chọn các hàng và cột nhưng không đồng thời.
Hầu hết mọi người đều quen thuộc với mục đích chính của toán tử lập chỉ mục DataFrame, đó là chọn các cột. Một chuỗi chọn một cột làm Sê-ri và một danh sách các chuỗi chọn nhiều cột làm DataFrame.
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
Sử dụng một danh sách chọn nhiều cột
df[['food', 'score']]
Điều mà mọi người ít quen thuộc là, khi ký hiệu lát được sử dụng, thì lựa chọn xảy ra theo nhãn hàng hoặc theo vị trí số nguyên. Điều này rất khó hiểu và một cái gì đó mà tôi gần như không bao giờ sử dụng nhưng nó hoạt động.
df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location
Các nhân chứng .loc/.iloc
cho việc chọn hàng rất được ưa thích. Toán tử lập chỉ mục không thể chọn các hàng và cột đồng thời.
df[3:5, 'color']
TypeError: unhashable type: 'slice'