Pandas 中的四中索引方式详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Allocator/article/details/72674567

Pandas 中的四中索引方式详解

第一次使用pandas 对于其中的Series 和DataFrame 的索引弄晕了,所以写了这篇文章详细的分析Pandas中的四中索引方式:1. 默认的索引[] 2.基于位置的索引.iloc 3.基于标签的索引.loc[] 以及混合索引 .ix[]

  1. 默认索引方式需要看传入内容,如果是数字那么就是基于位置的索引,不会返回最后一个元素,如果是传入的标签,那么就是标签的索引,会返回最后一个元素。但是它只能识别其中一种。举个例子,在DataFrame里面会出现即使用标签又使用位置的元素获取方式,此时使用[] 获取元素会出错,因为它要么识别标签要么识别位置,所以这个时候必须使用ix[] 混合索引才能够正确的获取元素。
  2. 基于位置索引,获取数字对应的位置的数据,不会包含最后一个数字对应的内容
  3. 基于标签的索引,返回标签位对应的数据,会包含最后一个标签对应的内容。注意在Series 以及DataFrame 中默认的行向,列项索引即可以当做标签解析又可以当做位置解析。
  4. 混合索引。根据传入内容会进行匹配,先按照标签索引,再按照位置索引返回数据
    实例如下:
    如获取Series 中的部分数据
s_obj1 = pd.Series(np.arange(5),index=['a','b','c','d','e'])
print s_obj1
print s_obj1['a':'b'] # 使用标签索引
print s_obj1[0:2] # 使用位置索引
dic1 = {2011:'hello',2012:'yes',2013:'fff'} # 此时2011 2012 2013 为标签
s_obj2 = pd.Series(dic1)
print s_obj2
print s_obj2[2011:2013] # 没有内容
print s_obj2.loc[2011:2013] # 使用标签索引
print s_obj2.ix[2011:2013] # 使用混合索引返回同样内容,当做标签解析

输出结果如下:

a    0
b    1
c    2
d    3
e    4
dtype: int32
a    0
b    1
dtype: int32
a    0
b    1
dtype: int32
2011    hello
2012      yes
2013      fff
dtype: object
Series([], dtype: object)
2011    hello
2012      yes
2013      fff
dtype: object
2011    hello
2012      yes
2013      fff
dtype: object

和预想的一样。使用dict构建Series的时候其中key为标签。可以通过标签索引获取,而直接传递数值会被当做位置索引,所以获取不到数据。
在DataFrame上面的实验如下:

dic2 = {
    'A':1,
    'B':pd.Series(np.arange(4),index=list(range(4)),dtype='float32'),
    'C':'hello',
    'D':pd.Timestamp('2017')
}
df_obj1 = pd.DataFrame(dic2)
print df_obj1
# print df_obj1[0:3,0:2]# 报错,无法正常实现分片操作 需要使用df_obj1.loc[0:3,0:2] 成功获取数据 不知道为什么不能够当做位置索引获取数据
print df_obj1[[0,1]] # 使用位置获取不连续索引数据
print df_obj1[[2]] # 如果使用位置索引获取单列(Series) 需要传递list型数据,比较特殊
print df_obj1['C'] # 和上面获取同样内容,使用列标签获取
print df_obj1.ix[0:3,0:2] # 获取四行两列数据 行向索引可以当成标签访问
print df_obj1.iloc[0:3,0:2] # 获取三行两列数据 纯位置索引

实验结果如下:

 A    B      C          D
0  1  0.0  hello 2017-01-01
1  1  1.0  hello 2017-01-01
2  1  2.0  hello 2017-01-01
3  1  3.0  hello 2017-01-01
   A    B
0  1  0.0
1  1  1.0
2  1  2.0
3  1  3.0
       C
0  hello
1  hello
2  hello
3  hello
0    hello
1    hello
2    hello
3    hello
Name: C, dtype: object
   A    B
0  1  0.0
1  1  1.0
2  1  2.0
3  1  3.0
   A    B
0  1  0.0
1  1  1.0
2  1  2.0

和预测结果一样

总结

Pandas 是python数据处理中比较重要的工具,利用索引进行数据操作也是非常普遍的。弄清楚其中的索引访问方式还是比较重要的,呵呵。

猜你喜欢

转载自blog.csdn.net/Allocator/article/details/72674567