Sự khác biệt giữa việc sử dụng loc và chỉ sử dụng dấu ngoặc vuông để lọc các cột trong Pandas / Python là gì?


83

Tôi đã nhận thấy ba phương pháp chọn một cột trong Pandas DataFrame:

Phương pháp chọn cột đầu tiên sử dụng loc:

df_new = df.loc[:, 'col1']

Phương pháp thứ hai - có vẻ đơn giản hơn và nhanh hơn:

df_new = df['col1']

Phương pháp thứ ba - thuận tiện nhất:

df_new = df.col1

Có sự khác biệt giữa ba phương pháp này? Tôi không nghĩ vậy, trong trường hợp đó, tôi muốn sử dụng phương pháp thứ ba.

Tôi chủ yếu tò mò là tại sao lại có ba phương pháp để làm điều tương tự.


1
Hoặc những gì về df.col1? Cả ba điều này về cơ bản là tương đương đối với trường hợp chọn một cột rất đơn giản. .locsẽ cho phép bạn làm nhiều việc hơn là chọn một cột. Có thể có bản sao của stackoverflow.com/questions/31593201/…
juanpa.arrivillaga

1
Họ làm điều tương tự đối với các lát đơn giản. loc rõ ràng hơn, đặc biệt khi các cột của bạn là số.
Gabriel A

Cảm ơn @ juanpa.arrivillaga. Điểm tốt là lại: df.col1, đây là một phương pháp chọn cột khác. Tôi đã thực sự xem xét câu hỏi khác đó vài lần trước đây. Thật tuyệt vời để giải thích loc và iloc. Tuy nhiên, câu hỏi này là về phương pháp khác: "df ['col1']". Tôi chỉ bối rối không hiểu tại sao lại có hai (hoặc ba) cách tương đương để thực hiện những việc dường như giống nhau.
Sean McCarthy

1
Nhược điểm lớn của phương pháp thứ 3 là nó không rõ ràng khi tên cột của bạn giống với thuộc tính hoặc phương thức pandas hiện có. Ví dụ: bạn đặt tên cho một cột là 'sum'. Sau đó, nếu bạn gõ df.sum, điều gì sẽ xảy ra? (cảnh báo spoiler, không có gì hữu ích, mặc dù df.sum()vẫn hoạt động may mắn) cách Vì vậy, thứ 3 nên được xem như một phím tắt đó là tốt, nhưng cần phải cẩn thận với
Johne

1
Một lời giải thích hợp lý ở đây stackoverflow.com/questions/38886080/…
Gaurav Taneja,

Câu trả lời:


85

Trong các tình huống sau, chúng cư xử giống nhau:

  1. Chọn một cột duy nhất ( df['A']giống như df.loc[:, 'A']-> chọn cột A)
  2. Chọn danh sách cột ( df[['A', 'B', 'C']]giống như df.loc[:, ['A', 'B', 'C']]-> chọn cột A, B và C)
  3. Cắt theo hàng ( df[1:3]giống như df.iloc[1:3]-> chọn hàng 1 và 2. Tuy nhiên, lưu ý, nếu bạn cắt các hàng locthay vì cắt iloc, bạn sẽ nhận được hàng 1, 2 và 3 giả sử bạn có RangeIndex . Xem chi tiết tại đây .)

Tuy nhiên, []không hoạt động trong các trường hợp sau:

  1. Bạn có thể chọn một hàng với df.loc[row_label]
  2. Bạn có thể chọn danh sách các hàng có df.loc[[row_label1, row_label2]]
  3. Bạn có thể cắt các cột với df.loc[:, 'A':'C']

Ba điều này không thể được thực hiện với []. Quan trọng hơn, nếu lựa chọn của bạn liên quan đến cả hàng và cột, thì việc gán sẽ trở nên khó khăn.

df[1:3]['A'] = 5

Thao tác này chọn hàng 1 và 2, sau đó chọn cột 'A' của đối tượng trả về và gán giá trị 5 cho nó. Vấn đề là, đối tượng trả về có thể là một bản sao nên điều này có thể không thay đổi DataFrame thực. Điều này làm tăng SettingWithCopyWarning . Cách chính xác của nhiệm vụ này là

df.loc[1:3, 'A'] = 5

Với .loc, bạn được đảm bảo sửa đổi DataFrame ban đầu. Nó cũng cho phép bạn cắt các cột ( df.loc[:, 'C':'F']), chọn một hàng ( df.loc[5]) và chọn danh sách các hàng ( df.loc[[1, 2, 5]]).

Cũng lưu ý rằng hai điều này không được đưa vào API cùng một lúc. .locđã được thêm vào sau đó như một trình chỉ mục rõ ràng và mạnh mẽ hơn. Xem câu trả lời của unutbu để biết thêm chi tiết.


Lưu ý: Bắt cột với []vs .là một chủ đề hoàn toàn khác. .chỉ có ở đó cho sự tiện lợi. Nó chỉ cho phép truy cập các cột có tên là mã định danh Python hợp lệ (nghĩa là chúng không thể chứa khoảng trắng, chúng không thể bao gồm các số ...). Nó không thể được sử dụng khi tên xung đột với các phương thức Series / DataFrame. Nó cũng không thể được sử dụng cho các cột không tồn tại (nghĩa là phép gán df.a = 1sẽ không hoạt động nếu không có cột a). Khác hơn thế, .[]đều giống nhau.


6

locđặc biệt hữu ích khi chỉ mục không phải là số (ví dụ: DatetimeIndex) vì bạn có thể lấy các hàng có nhãn cụ thể từ chỉ mục:

df.loc['2010-05-04 07:00:00']
df.loc['2010-1-1 0:00:00':'2010-12-31 23:59:59 ','Price']

Tuy nhiên, []mục đích là để lấy các cột có tên cụ thể:

df['Price']

Với []bạn cũng có thể lọc các hàng , nhưng nó được trau chuốt hơn:

df[df['Date'] < datetime.datetime(2010,1,1,7,0,0)]['Price']

0

Dường như có sự khác biệt giữa df.loc [] và df [] khi bạn tạo dataframe với nhiều cột.

Bạn có thể tham khảo câu hỏi này: Có cách nào hay để tạo nhiều cột bằng cách sử dụng .loc không?

Ở đây, bạn không thể tạo nhiều cột bằng cách sử dụng df.loc[:,['name1','name2']]nhưng bạn có thể thực hiện bằng cách sử dụng dấu ngoặc kép df[['name1','name2']]. (Tôi tự hỏi tại sao họ cư xử khác nhau.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.