简介
在pandas中最常见的操作就是索引和获取数据,在老版本中使用的ix
方法已经被抛弃,转而代之的是loc
和iloc
方法。
Series操作
在Series中索引和获取的工作方式类似NumPy数组。示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
>>>import pandas as pd >>>a = pd.Series(np.arange(5), index=list('abcde')) >>>a a 0 b 1 c 2 d 3 e 4 dtype: int32 >>>a[1] 1 >>>a['b'] 1 |
可以看出Series的索引值可以是整数,也可以是当前定义的索引值。
1 2 3 4 5 6 7 8 9 10 |
>>>a[1:3] b 1 c 2 dtype: int32 >>>a['b':'d'] b 1 c 2 d 3 dtype: int32 |
从这里可以看出,使用标签的切片运算和普通的切片不同,它的末端是包含了结束标签的值。
DataFrame操作
相比于Series,DataFrame中的操作会比较复杂。涉及到获取行或列,获取块数据等操作。可以使用标签切片,也可以使用普通的切片,其中涉及到的方法不同,接下来会一一介绍。
获取行
代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
>>>a = pd.DataFrame(np.random.randn(4, 3), index=['aa', 'bb', 'cc', 'dd'], columns=list('abc')) >>>a a b c aa 0.222784 -0.958186 -0.418945 bb 0.079387 -0.407945 -0.439140 cc 0.200142 0.674834 -1.769081 dd -1.182979 -0.048308 -1.299996 >>>a[0:2] a b c aa 0.222784 -0.958186 -0.418945 bb 0.079387 -0.407945 -0.439140 >>>a['aa', 'cc'] a b c aa 0.222784 -0.958186 -0.418945 bb 0.079387 -0.407945 -0.439140 cc 0.200142 0.674834 -1.769081 |
可以看出,使用标签切片和普通切片是不同的,前者会包括结束索引。在这里不能使用诸如a[0]
这样的操作来获得单独某行,会引发KeyError
错误。在后面会讲到如何获取单独一行的方法。
获取列
获取列的方式有两种,一种是使用列标签切片,一种是访问列属性。
代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>>a['c'] aa -0.418945 bb -0.439140 cc -1.769081 dd -1.299996 Name: c, dtype: float64 >>>a.c aa -0.418945 bb -0.439140 cc -1.769081 dd -1.299996 Name: c, dtype: float64 |
在这里提倡使用列表切片的方式,因为如果使用列属性的时候可能会发生错误,比如有一个列名叫index
,此时调用index
列会与pandas中的index
属性发生冲突。使用列标签切片的方式还能获取多列数据:
1 2 3 4 5 6 |
>>>a[['a', 'c']] a c aa 0.222784 -0.418945 bb 0.079387 -0.439140 cc 0.200142 -1.769081 dd -1.182979 -1.299996 |
获取块数据
可以使用loc
方法和iloc
方法获取块状数据,实际使用较多。loc
方法接受标签型索引,而iloc
方法只接受整数型索引。
方法 | 描述 |
---|---|
iloc[val1, val2] | 使用整数索引,val1为行索引,val2为列索引 |
loc[val1, val2] | 使用标签索引,val1为行索引,val2为列索引 |
代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
>>>a a b c aa 0.222784 -0.958186 -0.418945 bb 0.079387 -0.407945 -0.439140 cc 0.200142 0.674834 -1.769081 dd -1.182979 -0.048308 -1.299996 # 获取第一行 >>>a.loc['aa', :] a 0.222784 b -0.958186 c -0.418945 Name: aa, dtype: float64 >>>a.loc[['aa', 'cc'], ['a', 'c']] a c aa 0.222784 -0.418945 cc 0.200142 -1.769081 >>>a.loc['bb':'dd', 'b':'c'] b c bb -0.407945 -0.439140 cc 0.674834 -1.769081 dd -0.048308 -1.299996 |
可以看出,使用loc
方法要指明使用的标签索引,并且包含结束标签索引的数据。如果想通过整数索引获取数据,就要使用iloc
方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
>>>a a b c aa 0.222784 -0.958186 -0.418945 bb 0.079387 -0.407945 -0.439140 cc 0.200142 0.674834 -1.769081 dd -1.182979 -0.048308 -1.299996 # 获取第一行 >>>a.iloc[0, :] a 0.222784 b -0.958186 c -0.418945 Name: aa, dtype: float64 >>>a.iloc[[0, 2], [0, 2]] a c aa 0.222784 -0.418945 cc 0.200142 -1.769081 >>>a.iloc[1:, 1:] b c bb -0.407945 -0.439140 cc 0.674834 -1.769081 dd -0.048308 -1.299996 |
使用iloc
方法,就要注意使用切片的时候是不包含结束索引的数据。
总结
pandas中基本的索引和获取操作就是这些,在实际使用中应该学会触类旁通、举一反三。