本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接: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([1, 2, 3], index=[2, 0, 1])
2>>> obj2 = pd.Series([1, 2, 3], 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.使用loc
和iloc
方法选择数据
loc
和iloc
方法允许使用轴标签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 |
通过标签选择行或列 |
本篇文章来源于微信公众号: 码农设计师