【问题标题】:What is the type of loc and iloc? (brackets vs parentheses)loc和iloc的类型是什么? (括号与括号)
【发布时间】:2026-01-30 17:50:02
【问题描述】:

我来自 C++ 背景,最近开始学习 python。我正在研究索引和选择数据。我在 pandas 库的 SeriesDataFramePanel 课程中遇到了 .iloc[]。我不明白.iloc 是什么?它是功能还是属性?很多时候我错误地使用() 而不是[] 并且没有得到实际结果(但它不会给我一个错误)。

例子:

In [43]: s = pd.Series(np.arange(5), index=np.arange(5)[::-1], dtype='int64')

In [44]: s[s.index.isin([2, 4, 6])]
Out[44]: 
4    0
2    2
dtype: int64

In [45]: s.iloc(s.index.isin([2,4,6]))
Out[45]: <pandas.core.indexing._iLocIndexer at 0x7f1e68d53978>

In [46]: s.iloc[s.index.isin([2,4,6])]
Out[46]: 
4    0
2    2
dtype: int64

谁能告诉我参考在哪里可以更多地研究这种类型的运算符。

【问题讨论】:

标签: python pandas


【解决方案1】:

.iloc 是一个类实例。

pd.DataFrame().iloc
Out[2]: <pandas.core.indexing._iLocIndexer at 0x97a2470>

来源:Pandas Source Code - indexing.py#L1626

【讨论】:

    【解决方案2】:

    实用答案:您应该将ilocloc 分别视为python 列表和字典的pandas 扩展,并将它们视为查找而不是函数或方法调用。因此,与 python 语法保持一致,始终使用[] 而不是()

    >>> ser = pd.Series( { 'a':3, 'c':9 } )
    
    >>> ser.loc['a']    # pandas dictionary syntax (label-based)
    3
    >>> ser.iloc[0]     # pandas list/array syntax (location-based)
    3
    

    数据帧基本相同,只是需要指定一个额外的维度,这也是 ilocloc 变得更有用的地方,但这超出了这个问题的范围。

    更深层次的答案:如果你真的想更深入地理解这一点,你需要了解__getitem__。您也许可以从here 开始了解一些基础知识。 @ayhan 在上面的 cmets 中提供的 second link 中的答案也非常好,并且与您的问题非常相关。

    【讨论】:

    • 是否有一个现有的库用于使用loc/iloc-like getter 来处理由原始字典和列表组成的分层数据 - 而不是 pandas?
    • 我的意思是像 Wolram 语言这样的访问模型,其中切片、通配符和位置/标签索引共存于任意表达式(例如多维数组和字典)。给定 data = [{'a':1,'b':2,'c':3},{'a':4,'c':5}] 得到 'a' 和 'c' 像这样:data.myloc[_all_,['a','c']]--> ['{'a':1,'c':3},{'a':4,'c':5}] 其中_all_ 是通配符。 (在 WL 中删除了一个键:data.myloc[_all_,'a'] --> [1,4])。切片或数字索引也应该代替 _all_ 和任意深度。
    • @alancalvitti 抱歉,不知道。这超出了我的知识范围。
    最近更新 更多