2017-08-17 39 views
14

Tôi không thấy bất kỳ tài liệu nào về gấu trúc giải thích tham số False được chuyển vào loc. Bất cứ ai có thể giải thích cách() và [] khác nhau trong trường hợp này?Tại sao bạn có thể làm df.loc (Sai) ['value'] trong gấu trúc?

+3

OP, hãy nhớ, bạn có thể chấp nhận một trong các câu trả lời này nếu họ trả lời câu hỏi của bạn. –

Trả lời

12

df.loc là phiên bản của lớp _LocIndexer, là lớp con của lớp _NDFrameIndexer.

Khi bạn thực hiện df.loc(...), có vẻ như phương thức __call__ được gọi mà vô hại trả về một phiên bản khác của chính nó. Ví dụ:

In [641]: df.loc 
Out[641]: <pandas.core.indexing._LocIndexer at 0x10eb5f240> 

In [642]: df.loc()()()()()() 
Out[642]: <pandas.core.indexing._LocIndexer at 0x10eb5fe10> 

... 

Và cứ tiếp tục như vậy. Giá trị được chuyển trong (...) không được sử dụng bởi cá thể theo bất kỳ cách nào.

Mặt khác, các thuộc tính được chuyển đến [...] được gửi đến __getitem__/__setitem__ thực hiện truy xuất/cài đặt.

+0

Hoặc gán thông qua '__setitem__'. OP không chỉ định. –

+0

@MadPhysicist Lưu ý, cảm ơn bạn. –

+0

thông thường, các tham số có thể được bao gồm trong .loc (...) sau đó là gì? – user1559897

2

Đối với bất kỳ đối tượng python, () gọi phương thức __call__, trong khi [] gọi phương thức __getitem__ (trừ khi bạn đang thiết lập một giá trị, trong trường hợp này nó gọi __setitem__). Nói cách khác, ()[] gọi các phương pháp khác nhau, vậy tại sao bạn mong đợi họ hành động giống nhau?

5

Như câu trả lời khác đã giải thích, các () niềng răng gọi phương thức __call__, được định nghĩa là:

def __call__(self, axis=None): 
    # we need to return a copy of ourselves 
    new_self = self.__class__(self.obj, self.name) 

    new_self.axis = axis 
    return new_self 

Nó trả về một bản sao của chính nó. Bây giờ, đối số được truyền vào giữa số (), là để khởi tạo thành viên axis của bản sao mới của bạn. Vì vậy, điều này có thể nâng cao câu hỏi là tại sao nó không quan trọng giá trị bạn vượt qua như là đối số, chỉ số kết quả là chính xác như nhau. Câu trả lời cho câu hỏi này nằm trong thực tế là lớp siêu lớp _NDFrameIndexer được sử dụng cho nhiều lớp con.

Đối với phương thức .loc, gọi số _LocIndexer, thành viên này không quan trọng. Lớp LocIndexer chính nó là một phân lớp của _LocationIndexer, là một phân lớp của _NDFrameIndexer.

Mỗi lần axis được gọi là _LocationIndexer, giá trị mặc định là 0, không có khả năng tự xác định. Ví dụ tôi sẽ đề cập đến một trong những chức năng trong lớp, với những người khác sau phù hợp:

def __getitem__(self, key): 
    if type(key) is tuple: 
     key = tuple(com._apply_if_callable(x, self.obj) for x in key) 
     try: 
      if self._is_scalar_access(key): 
       return self._getitem_scalar(key) 
     except (KeyError, IndexError): 
      pass 
     return self._getitem_tuple(key) 
    else: 
     key = com._apply_if_callable(key, self.obj) 
     return self._getitem_axis(key, axis=0) 

Vì vậy, không có vấn đề gì đối số bạn vượt qua trong .loc(whatever), nó sẽ được ghi đè với giá trị mặc định. Hành vi tương tự bạn sẽ thấy khi gọi số .iloc, gọi số _iLocIndexer(_LocationIndexer) và do đó cũng ghi đè số này axis theo mặc định.

Trường hợp này, hãy làm như thế nào axis sau đó phát huy? Câu trả lời là: trong phương pháp .ix không được chấp nhận. Tôi có một dataframe hình dạng (2187, 5), và bây giờ xác định:

a = df.ix(0) 
b= df.ix(1) 
c = df.ix(2) 
a[0] == b[0] #True 
b[0] == c[0] #True 
a[0,1] == b[0,1] #False 

Nếu bạn sử dụng lập chỉ mục vô hướng đơn giản, axis vẫn phớt lờ trong ví dụ 2-D này, như là phương pháp get rơi trở lại đơn giản số nguyên dựa trên vô hướng indexing .Tuy nhiên, a[0,1] có hình dạng (2,5) < - phải mất hai mục nhập đầu tiên dọc theo axis=0; b[0,1] có hình dạng (2187, 2) < - phải mất hai mục đầu tiên dọc theo axis=1; c[0,1] trả về ValueError: No axis named 2 for object type <class 'pandas.core.frame.DataFrame'>.

Nói cách khác:

Bạn vẫn có thể gọi gọi phương pháp của lớp _NDFrameIndexer, vì nó được sử dụng trong các lớp con _IXIndexer. Tuy nhiên: Bắt đầu từ 0,20,0, chỉ mục .ix không được dùng nữa, có lợi cho các chỉ mục .iloc và .loc nghiêm ngặt hơn. Đối số được chuyển đến gọi cho .iloc và .loc bị bỏ qua.

Các vấn đề liên quan