>>> from env_helper import info; info()
页面更新时间: 2024-01-20 20:51:35
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-17-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

7.4. Pandas索引和选择数据

除了基于纯标签和整数之外,Pandas还提供了一种使用运算符进行选择和子集化对象的混合方法。 可以使用 loc() 函数或 iloc() 函数。

在旧版本中使用的是 ix ,现在已经被弃用。

  • loc 从索引中获取具有特定标签的行(或列)。这里的关键是:标签。标签的理解就是 名字

  • iloc 在索引中的特定位置获取行(或列)(因此它只接受整数)。这里的关键是:位置。位置的理解就是排第几个。

Python和NumPy索引运算符 [] 和属性运算符 . 。 可以在广泛的用例中快速轻松地访问Pandas数据结构。 然而,由于要访问的数据类型不是预先知道的,所以直接使用标准运算符具有一些优化限制。 对于生产环境的代码,建议利用以下介绍的 Pandas 数据访问方法。

7.4.1. .loc()

Pandas提供了各种方法来完成基于标签的索引。 切片时,也包括起始边界。整数是有效的标签,但它们是指标签而不是位置。

.loc() 具有多种访问方式,如 :

  • 单个标量标签

  • 标签列表

  • 切片对象

  • 一个布尔数组

loc() 需要两个单/列表/范围运算符,用 , 分隔。第一个表示行,第二个表示列。

>>> 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'])

select all rows for a specific column:

>>> df.loc[:,'A']
a   -0.003620
b   -0.948576
c    1.336592
d   -1.858504
e   -0.047024
f   -0.948449
g   -0.460432
h    1.583392
Name: A, dtype: float64

Select all rows for multiple columns, say list []

>>> print (df.loc[:,['A','C']])
          A         C
a -0.003620 -0.407102
b -0.948576 -0.386523
c  1.336592 -0.367189
d -1.858504 -0.186412
e -0.047024 -1.502742
f -0.948449 -1.506808
g -0.460432 -0.200745
h  1.583392  0.927126

Select few rows for multiple columns, say list [] :

>>> print (df.loc[['a','b','f','h'],['A','C']])
          A         C
a -0.003620 -0.407102
b -0.948576 -0.386523
f -0.948449 -1.506808
h  1.583392  0.927126

Select all rows for multiple columns, say list []

>>> print (df.loc[:,['A','C']])
          A         C
a -0.003620 -0.407102
b -0.948576 -0.386523
c  1.336592 -0.367189
d -1.858504 -0.186412
e -0.047024 -1.502742
f -0.948449 -1.506808
g -0.460432 -0.200745
h  1.583392  0.927126

Select range of rows for all columns:

>>> print (df.loc['a':'h'])
          A         B         C         D
a -0.003620  1.013847 -0.407102 -1.170358
b -0.948576 -1.204101 -0.386523 -0.026203
c  1.336592 -0.795746 -0.367189 -0.380285
d -1.858504 -0.424469 -0.186412 -0.803915
e -0.047024  0.110915 -1.502742  1.161166
f -0.948449  0.908346 -1.506808 -0.516526
g -0.460432 -2.170456 -0.200745 -2.704455
h  1.583392 -0.883348  0.927126  0.546050

for getting values with a boolean array :

>>> print (df.loc['a']>0)
A    False
B     True
C    False
D    False
Name: a, dtype: bool

7.4.2. .iloc()

Pandas提供了各种方法,以获得纯整数索引。像 Python 和 NumPy 一样,第一个位置是基于 0 的索引。

各种访问方式如下 -

  • 整数

  • 整数列表

  • 系列值

>>> 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  1.663714  0.603110  0.550256 -1.041392
1  1.735845 -1.258820 -0.078011  1.327377
2  0.942490  1.286213  1.809651 -0.137577
3 -0.350447 -0.712508 -0.250432  0.676848

进行切片:

>>> df.iloc[:4]
A B C D
0 1.663714 0.603110 0.550256 -1.041392
1 1.735845 -1.258820 -0.078011 1.327377
2 0.942490 1.286213 1.809651 -0.137577
3 -0.350447 -0.712508 -0.250432 0.676848
>>> df.iloc[1:5, 2:4]
C D
1 -0.078011 1.327377
2 1.809651 -0.137577
3 -0.250432 0.676848
4 0.224099 -0.476229

使用列表进行切片:

>>>
>>> print (df.iloc[[1, 3, 5], [1, 3]])
>>> print (df.iloc[1:3, :])
>>> print (df.iloc[:,1:3])
          B         D
1 -1.258820  1.327377
3 -0.712508  0.676848
5  1.066648  0.371840
          A         B         C         D
1  1.735845 -1.258820 -0.078011  1.327377
2  0.942490  1.286213  1.809651 -0.137577
          B         C
0  0.603110  0.550256
1 -1.258820 -0.078011
2  1.286213  1.809651
3 -0.712508 -0.250432
4 -1.229913  0.224099
5  1.066648  0.224111
6  0.090186  0.955380
7  0.867101  1.081663

7.4.3. 使用索引

使用多轴索引从Pandas对象获取值可使用以下符号 -

对象

索引

描述

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.140305
1    1.453873
2   -2.319895
3   -0.262825
4    1.555486
5    1.154312
6   -0.268970
7   -0.943927
Name: A, dtype: float64

使用列表方式索引多个列:

>>> print (df[['A','B']])
          A         B
0  0.140305 -0.291825
1  1.453873  1.703303
2 -2.319895 -0.658452
3 -0.262825  0.830273
4  1.555486  0.354612
5  1.154312  0.294191
6 -0.268970 -0.597697
7 -0.943927 -0.213384

使用 : 切片索引 :

>>> print (df[2:2])
Empty DataFrame
Columns: [A, B, C, D]
Index: []

7.4.4. 属性访问

可以使用属性运算符 . 来选择列。

示例如下 :

>>> 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    2.342803
1    2.336214
2    1.781837
3    0.660118
4    0.171099
5   -1.034442
6    0.182111
7   -0.680993
Name: A, dtype: float64