【问题标题】:What are the different methods to retrieve elements in a pandas Series?检索熊猫系列中的元素有哪些不同的方法?
【发布时间】:2016-04-13 13:46:27
【问题描述】:

在 pandas Series 中检索元素至少有 4 种方法:.iloc、.loc .ix 和直接使用 [] 运算符。

它们之间有什么区别?他们如何处理丢失的标签/超出范围的位置?

【问题讨论】:

    标签: python pandas series


    【解决方案1】:

    一般的想法是,虽然 .iloc 和 .loc 保证分别按位置和索引(标签)执行查找,但它们比使用 .ix 或直接使用 [] 运算符要慢一些。前两种方法根据要查找的 Series 中的索引类型和应查找的数据按索引或位置执行查找。

    不过,使用 .iloc 和 .loc 时也存在一些不一致之处,as described in this page

    下表总结了这 4 种查找方法的行为,具体取决于 (a) 要查找的系列是否具有整数或字符串索引(我暂时不考虑日期索引),(b) 如果所需的数据是单个元素、切片索引或列表(是的,行为改变!)和 (c) 是否在数据中找到索引。

    以下示例适用于 pandas 0.17.1、NumPy 1.10.4、Python 3.4.3。

    案例1:整数索引

    s = pd.Series(np.arange(100,105), index=np.arange(10,15))
    s
    10    100
    11    101
    12    102
    13    103
    14    104
    
    ** Single element **             ** Slice **                                       ** Tuple **
    s[0]       -> LAB -> KeyError    s[0:2]        -> POS -> {10:100, 11:101}          s[[1,3]]        -> LAB -> {1:NaN, 3:Nan}
    s[13]      -> LAB -> 103         s[10:12]      -> POS -> empty Series              s[[12,14]]      -> LAB -> {12:102, 14:104}
    ---                              ---                                               ---
    s.ix[0]    -> LAB -> KeyError    s.ix[0:2]     -> LAB -> empty Series              s.ix[[1,3]]     -> LAB -> {1:NaN, 3:Nan}
    s.ix[13]   -> LAB -> 103         s.ix[10:12]   -> LAB -> {10:100, 11:101, 12:102}  s.ix[[12,14]]   -> LAB -> {12:102, 14:104}
    ---                              ---                                               ---
    s.iloc[0]  -> POS -> 100         s.iloc[0:2]   -> POS -> {10:100, 11:101}          s.iloc[[1,3]]   -> POS -> {11:101, 13:103}
    s.iloc[13] -> POS -> IndexError  s.iloc[10:12] -> POS -> empty Series              s.iloc[[12,14]] -> POS -> IndexError
    ---                              ---                                               ---
    s.loc[0]   -> LAB -> KeyError    s.loc[0:2]    -> LAB -> empty Series              s.loc[[1,3]]    -> LAB -> KeyError
    s.loc[13]  -> LAB -> 103         s.loc[10:12]  -> LAB -> {10:100, 11:101, 12:102}  s.loc[[12,14]]  -> LAB -> {12:102, 14:104}
    

    案例 2:带字符串索引的系列

    s = pd.Series(np.arange(100,105), index=['a','b','c','d','e'])
    s
    a    100
    b    101
    c    102
    d    103
    e    104
    
    ** Single element **                             ** Slice **                                           ** Tuple **
    s[0]        -> POS -> 100                        s[0:2]          -> POS -> {'a':100,'b':101}           s[[0,2]]          -> POS -> {'a':100,'c':102} 
    s[10]       -> LAB, POS -> KeyError, IndexError  s[10:12]        -> POS -> Empty Series                s[[10,12]]        -> POS -> IndexError 
    s['a']      -> LAB -> 100                        s['a':'c']      -> LAB -> {'a':100,'b':101, 'c':102}  s[['a','c']]      -> LAB -> {'a':100,'b':101, 'c':102} 
    s['g']      -> POS,LAB -> TypeError, KeyError    s['f':'h']      -> LAB -> Empty Series                s[['f','h']]      -> LAB -> {'f':NaN, 'h':NaN}
    ---                                              ---                                                   ---
    s.ix[0]     -> POS -> 100                        s.ix[0:2]       -> POS -> {'a':100,'b':101}           s.ix[[0,2]]       -> POS -> {'a':100,'c':102} 
    s.ix[10]    -> POS -> IndexError                 s.ix[10:12]     -> POS -> Empty Series                s.ix[[10,12]]     -> POS -> IndexError 
    s.ix['a']   -> LAB -> 100                        s.ix['a':'c']   -> LAB -> {'a':100,'b':101, 'c':102}  s.ix[['a','c']]   -> LAB -> {'a':100,'b':101, 'c':102} 
    s.ix['g']   -> POS, LAB -> TypeError, KeyError   s.ix['f':'h']   -> LAB -> Empty Series                s.ix[['f','h']]   -> LAB -> {'f':NaN, 'h':NaN}
    ---                                              ---                                                   ---
    s.iloc[0]   -> POS -> 100                        s.iloc[0:2]     -> POS -> {'a':100,'b':101}           s.iloc[[0,2]]     -> POS -> {'a':100,'c':102} 
    s.iloc[10]  -> POS -> IndexError                 s.iloc[10:12]   -> POS -> Empty Series                s.iloc[[10,12]]   -> POS -> IndexError 
    s.iloc['a'] -> LAB -> TypeError                  s.iloc['a':'c'] -> POS -> ValueError                  s.iloc[['a','c']] -> POS -> TypeError    
    s.iloc['g'] -> LAB -> TypeError                  s.iloc['f':'h'] -> POS -> ValueError                  s.iloc[['f','h']] -> POS -> TypeError
    ---                                              ---                                                   ---
    s.loc[0]    -> LAB -> KeyError                   s.loc[0:2]     -> LAB -> TypeError                   s.loc[[0,2]]     -> LAB -> KeyError 
    s.loc[10]   -> LAB -> KeyError                   s.loc[10:12]   -> LAB -> TypeError                   s.loc[[10,12]]   -> LAB -> KeyError 
    s.loc['a']  -> LAB-> 100                         s.loc['a':'c'] -> LAB -> {'a':100,'b':101, 'c':102}  s.loc[['a','c']] -> LAB -> {'a':100,'c':102}    
    s.loc['g']  -> LAB -> KeyError                   s.loc['f':'h'] -> LAB -> Empty Series                s.loc[['f','h']] -> LAB -> KeyError
    

    请注意,有三种方法可以处理未找到的标签/超出范围的位置:抛出异常、返回 null Series 或返回具有与 NaN 值关联的所需键的 Series。

    另请注意,当使用按位置切片查询时,不包括结束元素,但在按标签查询时,包括结束元素。

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 2013-08-22
      • 2012-02-15
      • 2016-08-11
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多