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?
Trả lời
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.
Hoặc gán thông qua '__setitem__'. OP không chỉ định. –
@MadPhysicist Lưu ý, cảm ơn bạn. –
thông thường, các tham số có thể được bao gồm trong .loc (...) sau đó là gì? – user1559897
Đố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, ()
và []
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?
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.
- 1. Tại sao XMLHttpRequest ProgressEvent.lengthComputable có thể sai?
- 2. chức năng loc trong gấu trúc
- 3. MultiIndex-có trụ sở tại gấu trúc
- 4. tại sao gấu trúc sử dụng kích thước đơn ndarray
- 5. Kiểm tra xem giá trị có tồn tại trong chỉ mục khung dữ liệu gấu trúc
- 6. Xử lý gấu trúc dataframe vào violinplot
- 7. liệu munging trong gấu trúc
- 8. Tại sao tôi nên tạo bản sao của khung dữ liệu trong gấu trúc
- 9. Làm phẳng một mảng trong gấu trúc
- 10. Gấu trúc: Bạn có thể truy cập các mục cửa sổ đang lăn
- 11. Lỗi gấu trúc: đối tượng 'DataFrame' không có thuộc tính 'loc'
- 12. gấu trúc .at so với .loc
- 13. hàng gấu trúc cụ thể áp dụng
- 14. Sử dụng loc và iloc với nhau trong gấu trúc
- 15. gấu trúc có được vị trí của một chỉ số được đưa ra trong DataFrame
- 16. gấu trúc: thả bản sao trong groupby 'date'
- 17. Tại sao DataFrame.loc [[1]] chậm hơn 1,800x so với df.ix [[1]] và 3,500x so với df.loc [1]?
- 18. gấu trúc ValueError: numpy.dtype có kích thước sai, hãy thử biên dịch lại
- 19. Tại sao trong trường hợp @value dưới đây ("$ {someProperty}") đang làm việc trong khi @value ("# {someProperty}"), không hoạt động
- 20. Chuyển đổi gấu trúc đa-index để gấu trúc timestamp
- 21. Tại sao bạn không thể có một biến làm khóa trong bản đồ?
- 22. Thay None với NaN trong gấu trúc
- 23. Làm cách nào để có thể ánh xạ tiêu đề tới các cột trong gấu trúc?
- 24. Hiểu gấu trúc dataframe indexing
- 25. Thay thế có điều kiện trong gấu trúc
- 26. Tại sao bạn có thể gán nullptr cho std :: string?
- 27. hàng trùng lặp trong gấu trúc DF
- 28. giữ/lát cột cụ thể trong gấu trúc
- 29. Javascript: Tại sao nếu (sai)?
- 30. Làm thế nào để có điều kiện loại bỏ bản sao từ một dataframe gấu trúc
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. –