首页Python【Python数据分析】1...

【Python数据分析】18.索引、选择、过滤


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis

根据《Python for Data Analysis 3rd Edition》翻译整理

—————-————————————-

1.Series类型:

Series的索引obj[…]与Numpy数组类似,只不过Series的索引方式更多样,索引值可以不仅仅是整数。

 1>>> obj = pd.Series([9,8,7,6],index=['a','b','c','d'])
2>>> obj
3a    9
4b    8
5c    7
6d    6
7dtype: int64
8
9>>> obj[0]
109
11>>> obj['c']
127
13
14# 使用轴标签,索引多行
15>>> obj[['a','b']]
16a    9
17b    8
18dtype: int64
19
20# 使用位置标签,索引多行
21>>> obj[[0,3]]
22a    9
23d    6
24dtype: int64
25
26>>> obj[obj>7]
27a    9
28b    8
29dtype: int64

虽然你可以通过上述介绍的标签方式选择数据,但选择索引值的首选方式是使用特殊的loc操作符。

更推荐 loc 的原因是因为在使用 [] 进行索引时对整数的处理方式不同。如果索引包含整数,则基于[] 的常规索引会将整数视为标签;使用 loc 时,如果索引不包含整数,表达式将会报错。例如:

 1>>> obj1 = pd.Series([123], index=[201])
2>>> obj2 = pd.Series([123], index=["a""b""c"])
3>>> obj1 
42    1
50    2
61    3
7dtype: int64
8>>> obj2 
9a    1
10b    2
11c    3
12dtype: int64
13
14>>> obj1[[2, 1, 0]]
152    1
161    3
170    2
18dtype: int64
19
20>>> obj2[[2, 1, 0]]
21c    3
22b    2
23a    1
24dtype: int64
25
26>>> obj2.loc[[2, 1, 0]]
27KeyError: "None of [Int64Index([2, 1, 0], dtype='int64')] are in the [index]"

Python切片中取值范围是不包含尾部,Series对象的切片与之不同。

 1# 整数标签时,不包含尾部
2>>> obj[0:2]
3a    9
4b    8
5dtype: int64
6
7# 使用轴标签时,包含尾部
8>>> obj['a':'c']
9a    9
10b    8
11c    7
12dtype: int64

使用索引直接赋值新的值,会修改Series的相应部分。

1>>> obj['a':'c'] = 1
2>>> obj
3a    1
4b    1
5c    1
6d    6
7dtype: int64

2.DataFrame类型

使用单个值索引DataFrame中的一列,使用序列索引DataFrame中的多列。

 1>>> df = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','b','c'],columns=['XX','YY','ZZ'])
2>>> df
3   XX  YY  ZZ
4a   0   1   2
5b   3   4   5
6c   6   7   8
7
8>>> df['YY']
9a    1
10b    4
11c    7
12Name: YY, dtype: int32
13
14>>> df[['YY','XX']]
15   YY  XX
16a   1   0
17b   4   3
18c   7   6

也可以使用其他一些特殊索引方式,例如,可以根据一个布尔值数组切片或选择数据。

1>>> df[df['YY']>2]
2   XX  YY  ZZ
3b   3   4   5
4c   6   7   8

3.使用lociloc方法选择数据

lociloc方法允许使用轴标签loc或整数标签iloc以Numpy风格的语法从DataFrame中选择数据。

 1>>> df = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','b','c'],columns=['XX','YY','ZZ'])
2>>> df
3   XX  YY  ZZ
4a   0   1   2
5b   3   4   5
6c   6   7   8
7
8# 选择单行
9>>> df.loc['a']
10XX    0
11YY    1
12ZZ    2
13Name: a, dtype: int32
14
15# 选择多行
16>>> df.loc[['c','b']]
17   XX  YY  ZZ
18c   6   7   8
19b   3   4   5
20
21# 选择单行
22>>> df.iloc[0]
23XX    0
24YY    1
25ZZ    2
26Name: a, dtype: int32
27
28# 选择多行
29>>> df.iloc[[2,0]]
30   XX  YY  ZZ
31c   6   7   8
32a   0   1   2

可以通过用逗号分隔的方式来组合需要选择的行和列。

 1# 使用loc方法选择单行多列
2>>> df.loc['b',['XX','ZZ']]
3XX    3
4ZZ    5
5Name: b, dtype: int32
6
7# 使用iloc方法选择单行多列
8>>> df.iloc[1,[0,2]]
9XX    3
10ZZ    5
11Name: b, dtype: int32
12
13# 使用loc方法选择多行多列
14>>> df.loc[['a','c'],['XX','ZZ']]
15   XX  ZZ
16a   0   2
17c   6   8
18
19# 使用iloc方法选择多行多列
20>>> df.iloc[[0,2],[0,2]]
21   XX  ZZ
22a   0   2
23c   6   8

除了使用单个标签或标签列表索引之外,还可以用于切片操作。

1>>> df.loc[:'b' , :'YY']
2   XX  YY
3a   0   1
4b   3   4
5
6>>> df.iloc[:2 , 1:]
7   YY  ZZ
8a   1   2
9b   4   5

布尔数组可以与 loc 一起使用,但不能与 iloc 一起使用。

 1>>> df['YY'] > 2
2a    False
3b     True
4c     True
5Name: YY, dtype: bool
6
7>>> df.loc[df['YY'] > 2]
8   XX  YY  ZZ
9b   3   4   5
10c   6   7   8

4.df.at[]df.iat[]:

df.at[]——根据行、列标签选择单个标量值。

df.iat[]——根据行、列整数位置选择单个标量值。

 1>>> df = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','b','c'],columns=['XX','YY','ZZ'])
2>>> df
3   XX  YY  ZZ
4a   0   1   2
5b   3   4   5
6c   6   7   8
7
8>>> df.at['b','YY']
94
10>>> df.iat[1,1]
114

5.总结:

DataFrame的索引选项如下所示:

类型
说明
df[column] 从DataFrame中选择单列或列序列
df.loc[rows] 根据标签选择DataFrame的单行或多行
df.loc[:, cols] 根据标签选择DataFrame的单列或多列
df.loc[rows, cols] 同时选择行和列中的一部分
df.iloc[rows] 根据整数位置选择单行或多行
df.iloc[:, cols] 根据整数位置选择单列或多列
df.iloc[rows, cols] 根据整数位置选择行和列
df.at[row, col] 根据行、列标签选择单个标量值
df.iat[row, col] 根据行、列整数位置选择单个标量值
reindex method 通过标签选择行或列


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments