【发布时间】:2016-04-13 13:46:27
【问题描述】:
在 pandas Series 中检索元素至少有 4 种方法:.iloc、.loc .ix 和直接使用 [] 运算符。
它们之间有什么区别?他们如何处理丢失的标签/超出范围的位置?
【问题讨论】:
在 pandas Series 中检索元素至少有 4 种方法:.iloc、.loc .ix 和直接使用 [] 运算符。
它们之间有什么区别?他们如何处理丢失的标签/超出范围的位置?
【问题讨论】:
一般的想法是,虽然 .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。
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}
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。
另请注意,当使用按位置切片查询时,不包括结束元素,但在按标签查询时,包括结束元素。
【讨论】: