我没有看到熊猫解释传入loc的参数False的任何文档。任何人都可以解释()和[]在这种情况下的不同吗?为什么你可以在熊猫做df.loc(False)['value']?
回答
df.loc
是_LocIndexer
类的一个实例,它恰好是_NDFrameIndexer
类的子类。
当你做df.loc(...)
,它似乎__call__
方法被调用,它无害地返回自己的另一个实例。例如:
In [641]: df.loc
Out[641]: <pandas.core.indexing._LocIndexer at 0x10eb5f240>
In [642]: df.loc()()()()()()
Out[642]: <pandas.core.indexing._LocIndexer at 0x10eb5fe10>
...
依此类推。以任何方式不会使用在(...)
中传递的值。
另一方面,传递给[...]
的属性被发送到检索/设置的__getitem__
/__setitem__
。
或通过'__setitem__'分配。 OP没有说明。 –
@MadPhysicist注意,谢谢。 –
通常,可以包含在.loc(...)中的参数是什么? – user1559897
对于任何Python对象,()
调用__call__
方法,而[]
调用__getitem__
方法(除非要设置的值,在这种情况下,它调用__setitem__
)。换句话说,()
和[]
调用不同的方法,那么为什么你会期望它们的行为相同呢?
作为其他的答案已经解释,所述()
括号调用__call__
方法,其被定义为:
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
它返回其自身的副本。现在,在()
之间传递的参数是实例化新副本的axis
成员。所以,这可能会提出一个问题,即为什么不论你作为参数传递什么值并不重要,所得到的索引器完全相同。这个问题的答案在于超类_NDFrameIndexer
用于多个子类。
对于调用_LocIndexer
类的.loc
方法,此成员无关紧要。 LocIndexer
类本身是_LocationIndexer
的一个子类,它是_NDFrameIndexer
的子类。
每次被_LocationIndexer
调用时,默认为0,不可能自己指定它。例如,我会参考的类中的功能之一,与其他人纷纷效仿:
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)
所以,无论你在.loc(whatever)
传递什么样的参数,将使用默认值覆盖。在调用.iloc
时会看到类似的行为,该行为调用_iLocIndexer(_LocationIndexer)
,因此默认情况下也会覆盖axis
。
这个axis
在哪里呢?答案是:在已弃用的.ix
方法中。我有形状(2187, 5)
的数据帧,而现在定义:
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
如果你用简单的标索引,axis
仍然忽略了这2-d例如,作为get
方法回落到简单的基于整型标索引。然而,a[0,1]
已形成(2,5)
< - 它需要沿着axis=0
; b[0,1]
已形状(2187, 2)
< - 它需要沿axis=1
前两个条目; c[0,1]
返回ValueError: No axis named 2 for object type <class 'pandas.core.frame.DataFrame'>
。
换句话说:
您仍然可以调用_NDFrameIndexer类的呼叫方法,因为它是在_IXIndexer子类中使用。但是:从0.20.0开始,.ix索引器已被弃用,以支持更严格的.iloc和.loc索引器。将参数传递给调用 .iloc和.loc将被忽略。
- 1. 你无法用Angular.js做什么,你可以用jQuery做什么
- 2. 你可以用grep来做什么,你可以用egrep做什么?
- 3. 熊猫的速度df.loc [x,'column']
- 4. 熊猫 - 从df.loc检索价值
- 5. 熊猫Multiindex:我做错了什么?
- 6. 熊猫的子运营商做什么?
- 7. 你可以用AppleScript做什么?
- 8. 你如何知道你可以在api中做什么?
- 9. 为什么熊猫数据框可以彼此改变?
- 10. 在做的熊猫
- 11. 你怎么每天在熊猫
- 12. 是否可以在熊猫
- 13. 为什么[ '你好']为[ '你好']在Python返回False?
- 14. 为什么你可以在命名空间中覆盖true而不是false?
- 15. 如何做熊猫
- 16. numpy方法为什么可以在熊猫数据框上工作?
- 17. 是否可以在熊猫中做到这一点?
- 18. 在NS2中可以做什么以及不能做什么?
- 19. 为什么大熊猫 '==' 不同于 '.EQ()'
- 20. 熊猫:为什么pandas.Series.std()不同于numpy.std()
- 21. 为什么你可以使用方法
- 22. 为什么你可以分配给NotImplemented?
- 23. 为什么JSON.parse('{“key”:“value”}')做得很好,但JSON.parse('{key:“value”}')不?
- 24. Internet Explorer 11将value =“1_1”更改为value =“1”!我能做什么?
- 25. python:熊猫np.where与df.loc有多个条件
- 26. 熊猫:调用df.loc []选自pd.datetime的索引
- 27. 什么是有效的方式在熊猫做summaryBy(...,full.dimension = T)
- 28. 在电路设计旁边,你可以用VHDL做什么?
- 29. 你可以在CoreBluetooth后台委托调用中做什么?
- 30. 你可以在ant Task.init()方法中做什么?
OP,请记住,如果他们回答您的问题,您可以接受其中一个答案。 –