除了基于纯标签和整数之外,Pandas还提供了一种使用运算符进行选择和子集化对象的混合方法。
可以使用 loc()
函数或 iloc()
函数。
在旧版本中使用的是 ix
,现在已经被弃用。
loc
从索引中获取具有特定标签的行(或列)。这里的关键是:标签。标签的理解就是 名字 。iloc
在索引中的特定位置获取行(或列)(因此它只接受整数)。这里的关键是:位置。位置的理解就是排第几个。
Python和 NumPy
索引运算符 []
和属性运算符 .
在广泛的用例中提供对 Pandas 数据结构的快速轻松访问,
然而,由于要访问的数据类型不是预先知道的,所以直接使用标准运算符具有一些优化限制。
对于生产环境的代码,建议利用以下介绍的 Pandas
数据访问方法。
Pandas提供了各种方法来完成基于标签的索引。 切片时,还包括起始边界。整数是有效的标签,但它们是指标签而不是位置。
.loc()
有多种访问方式,如 :
- 单个标量标签
- 标签列表
- 切片对象
- 一个布尔数组
loc()
采用两个由 ','
分隔的 single/list/range 运算符。
第一个表示行,第二个表示列。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4),
index = ['a','b','c','d','e','f','g','h'],
columns = ['A', 'B', 'C', 'D'])
选择特定列的所有行:
df.loc[:,'A']
a 0.196706 b 0.575482 c 2.071356 d -1.968913 e -0.007613 f 1.333231 g 1.431777 h 0.535235 Name: A, dtype: float64
选择多列的所有行:
print (df.loc[:,['A','C']])
A C a 0.196706 -1.454478 b 0.575482 -0.735380 c 2.071356 -0.220071 d -1.968913 -0.430310 e -0.007613 0.503843 f 1.333231 0.311631 g 1.431777 0.794433 h 0.535235 0.751034
选择指定多列的部分行:
print (df.loc[['a','b','f','h'],['A','C']])
A C a 0.196706 -1.454478 b 0.575482 -0.735380 f 1.333231 0.311631 h 0.535235 0.751034
选择指定多列的部分行:
print (df.loc[:,['A','C']])
A C a 0.196706 -1.454478 b 0.575482 -0.735380 c 2.071356 -0.220071 d -1.968913 -0.430310 e -0.007613 0.503843 f 1.333231 0.311631 g 1.431777 0.794433 h 0.535235 0.751034
选择指定行范围的所有列:
print (df.loc['a':'h'])
A B C D a 0.196706 0.546186 -1.454478 1.046568 b 0.575482 0.435581 -0.735380 -0.724666 c 2.071356 1.054558 -0.220071 -0.454678 d -1.968913 0.795006 -0.430310 0.069804 e -0.007613 -0.391660 0.503843 1.100698 f 1.333231 2.948374 0.311631 0.057250 g 1.431777 -0.157955 0.794433 -2.435021 h 0.535235 0.777066 0.751034 -1.183087
使用布尔数组获取数据值:
print (df.loc['a']>0)
A True B True C False D True Name: a, dtype: bool
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
从特定列中选择所有行:
print (df.iloc[:4])
A B C D 0 0.204115 0.444572 -1.410090 1.162287 1 0.207207 0.703899 -0.436464 0.570959 2 -1.146030 0.588007 -1.244051 -0.546822 3 2.506358 -0.091505 -0.776620 0.081910
进行切片:
df.iloc[:4]
A | B | C | D | |
---|---|---|---|---|
0 | 0.204115 | 0.444572 | -1.410090 | 1.162287 |
1 | 0.207207 | 0.703899 | -0.436464 | 0.570959 |
2 | -1.146030 | 0.588007 | -1.244051 | -0.546822 |
3 | 2.506358 | -0.091505 | -0.776620 | 0.081910 |
df.iloc[1:5, 2:4]
C | D | |
---|---|---|
1 | -0.436464 | 0.570959 |
2 | -1.244051 | -0.546822 |
3 | -0.776620 | 0.081910 |
4 | -0.784487 | 2.241992 |
使用列表进行切片:
print (df.iloc[[1, 3, 5], [1, 3]])
B D 1 0.703899 0.570959 3 -0.091505 0.081910 5 0.445249 -0.163513
print (df.iloc[1:3, :])
A B C D 1 0.207207 0.703899 -0.436464 0.570959 2 -1.146030 0.588007 -1.244051 -0.546822
print (df.iloc[:,1:3])
B C 0 0.444572 -1.410090 1 0.703899 -0.436464 2 0.588007 -1.244051 3 -0.091505 -0.776620 4 -0.167509 -0.784487 5 0.445249 1.165959 6 0.008146 1.667599 7 0.079490 -0.793951
对象 | 索引 | 描述 |
---|---|---|
Series | s.loc[indexer] |
标量值 |
DataFrame | df.loc[row_index,col_index] |
标量对象 |
Panel | p.loc[item_index,major_index, minor_index] |
p.loc[item_index,major_index, minor_index] |
注意 : .iloc()
和 .ix()
应用相同的索引选项和返回值。
现在来看看如何在DataFrame对象上执行每个操作。这里使用基本索引运算符[]
:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print (df['A'])
0 0.594759 1 -0.712630 2 -0.417296 3 -0.458302 4 1.384736 5 -0.677542 6 0.538876 7 -0.389204 Name: A, dtype: float64
使用列表方式索引多个列:
print (df[['A','B']])
A B 0 0.594759 0.921297 1 -0.712630 -0.131828 2 -0.417296 1.590836 3 -0.458302 -2.537736 4 1.384736 0.819410 5 -0.677542 0.307177 6 0.538876 1.107698 7 -0.389204 -0.245940
使用 :
切片索引 :
print (df[2:2])
Empty DataFrame Columns: [A, B, C, D] Index: []
示例如下 :
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(8, 4), columns = ['A', 'B', 'C', 'D'])
print (df.A)
0 0.545451 1 -0.748731 2 0.547501 3 1.406779 4 -0.291601 5 -0.862779 6 -0.156417 7 -0.191933 Name: A, dtype: float64