python - iloc 和 loc 有何不同?

标签 python pandas indexing dataframe

有人可以解释这两种切片方法有何不同吗?
我见过the docs ,
我见过 these answers ,但我仍然发现自己无法理解这三者有何不同。对我来说,它们在很大程度上似乎可以互换,因为它们处于较低的切片级别。
例如,假设我们想要获取 DataFrame 的前五行。 .这两个是如何工作的?

df.loc[:5]
df.iloc[:5]
有人可以提出三种用法区别更清楚的情况吗?

曾几何时,我也想知道这两个功能和df.ix[:5]有什么区别但是 ix已从 pandas 1.0 中删除,所以我不再关心了。

最佳答案

标签与位置
这两种方法的主要区别是:

  • loc获取具有特定 的行(和/或列)标签 .
  • iloc获取整数 处的行(和/或列)地点 .

  • 为了演示,考虑一个系列 s具有非单调整数索引的字符:
    >>> s = pd.Series(list("abcdef"), index=[49, 48, 47, 0, 1, 2]) 
    49    a
    48    b
    47    c
    0     d
    1     e
    2     f
    
    >>> s.loc[0]    # value at index label 0
    'd'
    
    >>> s.iloc[0]   # value at index location 0
    'a'
    
    >>> s.loc[0:1]  # rows at index labels between 0 and 1 (inclusive)
    0    d
    1    e
    
    >>> s.iloc[0:1] # rows at index location between 0 and 1 (exclusive)
    49    a
    
    以下是 s.loc 之间的一些差异/相似之处和 s.iloc当传递各种对象时:


    <对象>
    描述s.loc[<object>]s.iloc[<object>]
    0单品
    索引标签处的值 0 (字符串 'd' )
    索引位置 0 处的值(字符串 'a')
    0:1
    两个行(标签 01)
    一个行(位置 0 处的第一行)
    1:47带越界结束的切片
    行(空系列)
    行(位置 1 起)
    1:47:-1带负步的切片
    行(标签 1 回到 47)
    行(空系列)
    [2, 0]整数列表
    两个具有给定标签的行
    两个具有给定位置的行
    s > 'e'Bool 系列(指示哪些值具有属性)
    一个行(包含 'f')NotImplementedError(s>'e').values bool 数组
    一个行(包含 'f')
    loc999int 对象不在索引中KeyErrorIndexError (越界)
    -1int 对象不在索引中KeyError返回 s 中的最后一个值
    lambda x: x.index[3]可调用应用于系列(此处返回索引中的第三项)s.loc[s.index[3]]s.iloc[s.index[3]]
    loc的标签查询功能远远超出整数索引,值得强调几个额外的例子。
    这是一个索引包含字符串对象的系列:
    >>> s2 = pd.Series(s.index, index=s.values)
    >>> s2
    a    49
    b    48
    c    47
    d     0
    e     1
    f     2
    
    loc是基于标签的,它可以使用 s2.loc['a'] 获取系列中的第一个值.它还可以使用非整数对象切片:
    >>> s2.loc['c':'e']  # all rows lying between 'c' and 'e' (inclusive)
    c    47
    d     0
    e     1
    
    对于 DateTime 索引,我们不需要传递确切的日期/时间来按标签获取。例如:
    >>> s3 = pd.Series(list('abcde'), pd.date_range('now', periods=5, freq='M')) 
    >>> s3
    2021-01-31 16:41:31.879768    a
    2021-02-28 16:41:31.879768    b
    2021-03-31 16:41:31.879768    c
    2021-04-30 16:41:31.879768    d
    2021-05-31 16:41:31.879768    e
    
    然后要获取 2021 年 3 月/4 月的行,我们只需要:
    >>> s3.loc['2021-03':'2021-04']
    2021-03-31 17:04:30.742316    c
    2021-04-30 17:04:30.742316    d
    
    行和列lociloc使用 DataFrame 的方式与使用 Series 的方式相同。需要注意的是,这两种方法都可以同时处理列和行。
    当给定一个元组时,第一个元素用于索引行,如果存在,第二个元素用于索引列。
    考虑下面定义的 DataFrame:
    >>> import numpy as np 
    >>> df = pd.DataFrame(np.arange(25).reshape(5, 5),  
                          index=list('abcde'), 
                          columns=['x','y','z', 8, 9])
    >>> df
        x   y   z   8   9
    a   0   1   2   3   4
    b   5   6   7   8   9
    c  10  11  12  13  14
    d  15  16  17  18  19
    e  20  21  22  23  24
    
    然后例如:
    >>> df.loc['c': , :'z']  # rows 'c' and onwards AND columns up to 'z'
        x   y   z
    c  10  11  12
    d  15  16  17
    e  20  21  22
    
    >>> df.iloc[:, 3]        # all rows, but only the column at index location 3
    a     3
    b     8
    c    13
    d    18
    e    23
    
    有时我们想为行和列混合标签和位置索引方法,以某种方式结合 loc 的功能。和 iloc .
    例如,考虑以下 DataFrame。如何最好地将行切成并包括“c”并取前四列?
    >>> import numpy as np 
    >>> df = pd.DataFrame(np.arange(25).reshape(5, 5),  
                          index=list('abcde'), 
                          columns=['x','y','z', 8, 9])
    >>> df
        x   y   z   8   9
    a   0   1   2   3   4
    b   5   6   7   8   9
    c  10  11  12  13  14
    d  15  16  17  18  19
    e  20  21  22  23  24
    
    我们可以使用 iloc 实现这个结果以及另一种方法的帮助:
    >>> df.iloc[:df.index.get_loc('c') + 1, :4]
        x   y   z   8
    a   0   1   2   3
    b   5   6   7   8
    c  10  11  12  13
    
    get_loc() 是一个索引方法,意思是“获取标签在这个索引中的位置”。请注意,由于使用 iloc 进行切片不包括它的端点,如果我们还想要行 'c',我们必须给这个值加 1。

    关于python - iloc 和 loc 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31593201/

    相关文章:

    caching - mongodb:强制内存中

    python - 从 list 内的子列表中提取最长的字符串。 Python

    python - 如果我有外键,我该如何在 Django 中执行此 "order by"?

    java - Google Foobar Bug 挑战在提交后重置

    python - 查找至少一行包含字母的列

    python - 当 DataFrame 包含对象时,pandas groupby 数字函数将数字强制转换为对象

    python - Pandas xlrd 引擎传递了静态值错误

    添加新索引值后,Postgresql 变得不负责任

    mysql - join mysql 中未使用索引

    python - 如何更改 Mayavi 中线图的管半径?