本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用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.DataFrame类型介绍
DataFrame表示的是矩阵数据表格,包含一个有序的、命名的列集合,每个列可以是不同的值类型(数字、字符串、布尔值等)。
DataFrame有行索引(index)和列索引(column),因此可以被认为是一个共享相同索引的 Series 字典。
DataFrame常用于表达二维数据,但也可以通过分层索引的方式表达多维数据。
2.DataFrame类型的创建
与Series一样,通过向pd.DataFrame()
方法传递数据的方式,实例化一个DataFrame对象。
DataFrame构造函数的有效输入主要有以下几种:
类型 |
说明 |
2D ndarray | 数据的矩阵,行和类的标签是可选参数 |
数组、列表和元祖构成的字典 | 每个序列将成为DataFrame的一列,所有序列的长度必须相同 |
Numpy结构化/记录化数组 | 与数组构成的字典一致 |
Series构成的字典 | 每个值成为一列,每个Series的索引联合起来形成结果的行索引,,也可以显式地传递索引 |
字典构成的字典 | 每一个内部字典成为一列,键联合起来形成结果的索引 |
字典或Series构成的列表 | 列表中的一个元素形成DataFrame的一行,字典键或Series索引联合起来形成DataFrame的列标签 |
列表或元祖构成的列表 | 与2D ndarray一致 |
其他DataFrame | 如果不显式传递索引,则会使用原DataFrame的索引 |
NumPy MaskedArray | 与2D ndarray类似,但隐蔽值会在结果DataFrame中称为缺失值 |
-
等长度列表组成的字典:
生成的DataFrame将自动分配索引,就像Series一样,并且列是根据数据中的键的顺序(在字典中的插入顺序)来排列的。
1>>> data = {'city':['India','Canada','France','Italy','USA','Spain'],
2 'continent':['Asia','North America','Europe','Europe','North America','Europe'],
3 'score':[90,80,50,70,60,40]}
4
5>>> df = pd.DataFrame(data)
6>>> df
7
8 city continent score
90 India Asia 90
101 Canada North America 80
112 France Europe 50
123 Italy Europe 70
134 USA North America 60
145 Spain Europe 40
-
等长度ndarray数组组成的字典:
1>>> data = {'one':np.array([0,1,2,3,4]) , 'two':np.array([5,6,7,8,9])}
2
3>>> df = pd.DataFrame(data)
4>>> df
5
6 one two
70 0 5
81 1 6
92 2 7
103 3 8
114 4 9
-
包含字典的字典类型:
字典的键将作为列,内部字典的键将作为行索引。
1>>> data = {'Canada':{2000:80 , 2001:90 },
2 'France':{2000:70 , 2001:80},
3 'Italy':{2000:60 , 2001:85, 2002:100}}
4
5>>> df = pd.DataFrame(data)
6>>> df
7
8 Canada France Italy
92000 80.0 70.0 60
102001 90.0 80.0 85
112002 NaN NaN 100
-
包含Series对象的字典:
1>>> data = {'Canada':pd.Series([80,90],index=[2000,2001]),
2 'France':pd.Series([70,80],index=[2000,2001])}
3
4>>> df = pd.DataFrame(data)
5>>> df
6
7
8 Canada France
92000 80 70
102001 90 80
-
二维ndarray对象:
1>>> data = np.arange(6).reshape(2,3)
2>>> data
3array([[0, 1, 2],
4 [3, 4, 5]])
5
6>>> df = pd.DataFrame(data)
7>>> df
8
9 0 1 2
100 0 1 2
111 3 4 5
3.指定列和索引
通过columns指定列的顺序,通过index指定索引。
1>>> data = {'city':['India','Canada','France','Italy','USA','Spain'],
2 'continent':['Asia','North America','Europe','Europe','North America','Europe'],
3 'score':[90,80,50,70,60,40]}
4
5>>> df = pd.DataFrame(data , columns=['continent','city','score'] , index=['one','two','three','four','five','six'])
6>>> df
7
8
9 continent city score
10one Asia India 90
11two North America Canada 80
12three Europe France 50
13four Europe Italy 70
14five North America USA 60
15six Europe Spain 40
如果columns传递的列不在数据中,dataframe中会出现缺失值。
1>>> df = pd.DataFrame(data , columns=['continent','city','score','year'] , index=['one','two','three','four','five','six'])
2>>> df
3
4 continent city score year
5one Asia India 90 NaN
6two North America Canada 80 NaN
7three Europe France 50 NaN
8four Europe Italy 70 NaN
9five North America USA 60 NaN
10six Europe Spain 40 NaN
索引和列也拥有name属性,如果有的话会被显式出来。
1>>> df.index.name = '索引名'
2>>> df.columns.name = '列名'
3>>> df
4
5列名 continent city score year
6索引名
7one Asia India 90 NaN
8two North America Canada 80 NaN
9three Europe France 50 NaN
10four Europe Italy 70 NaN
11five North America USA 60 NaN
12six Europe Spain 40 NaN
和Series类似,DataFrame的values属性会将包含在DataFrame中的数据以二维ndarray的形式返回。如果DataFrame中的列具有不同的数据类型dtype,会自动选择适合所有列的类型。
1>>> df.values
2array([['Asia', 'India', 90, nan],
3 ['North America', 'Canada', 80, nan],
4 ['Europe', 'France', 50, nan],
5 ['Europe', 'Italy', 70, nan],
6 ['North America', 'USA', 60, nan],
7 ['Europe', 'Spain', 40, nan]], dtype=object)
4.行和列的获取:
1>>> data = {'city':['India','Canada','France','Italy','USA','Spain'],
2 'continent':['Asia','North America','Europe','Europe','North America','Europe'],
3 'score':[90,80,50,70,60,40]}
4
5>>> df = pd.DataFrame(data , columns=['continent','city','score'] , index=['one','two','three','four','five','six'])
6>>> df
7
8 continent city score
9one Asia India 90
10two North America Canada 80
11three Europe France 50
12four Europe Italy 70
13five North America USA 60
14six Europe Spain 40
4.1 列的获取
DataFrame中的一列,可以通过字典型标记或点属性的方式检索为Series对象。
TIPS:DataFrame[column]的方式 适用于任何列名,但 DataFrame.column 的方式仅在列名是有效的 Python 变量名并且不与 DataFrame 中的任何方法名冲突时才有效。例如,如果列的名称包含空格或下划线以外的符号,则不能使用点属性方法访问它。
1>>> df['continent']
2one Asia
3two North America
4three Europe
5four Europe
6five North America
7six Europe
8Name: continent, dtype: object
9
10>>> df.city
11one India
12two Canada
13three France
14four Italy
15five USA
16six Spain
17Name: city, dtype: object
列的引用是可以修改的。可以赋值为标量值或值数组。
1>>> df['score'] = 100
2>>> df
3
4 continent city score
5one Asia India 100
6two North America Canada 100
7three Europe France 100
8four Europe Italy 100
9five North America USA 100
10six Europe Spain 100
11
12
13>>> df['score'] = np.array([100,90,80,70,60,50])
14>>> df
15
16 continent city score
17one Asia India 100
18two North America Canada 90
19three Europe France 80
20four Europe Italy 70
21five North America USA 60
22six Europe Spain 50
将Series赋值给一列时,Series的索引将会按照DataFrame的索引重新排序,并在空缺的地方填充缺失值。
1>>> value = pd.Series([90,80,70] , index=['one','three','six'])
2
3>>> df['score'] = value
4>>> df
5
6 continent city score
7one Asia India 90.0
8two North America Canada NaN
9three Europe France 80.0
10four Europe Italy NaN
11five North America USA NaN
12six Europe Spain 70.0
TIPS: 从DataFrame中选取的列是数据的视图,而不是拷贝。因此对Series的修改会映射到原DataFrame中。如需复制,需要使用copy方法进行显式操作。
如果被赋值的列并不存在,则会生成一个新的列。
1>>> value = df['continent'] == 'Europe'
2>>> value
3one False
4two False
5three True
6four True
7five False
8six True
9Name: continent, dtype: bool
10
11>>> df['labels'] = value
12>>> df
13
14 continent city score labels
15one Asia India 90.0 False
16two North America Canada NaN False
17three Europe France 80.0 True
18four Europe Italy NaN True
19five North America USA NaN False
20six Europe Spain 70.0 True
可以通过 del 关键字删除指定列。
1>>> del df['labels']
2>>> df
3
4 continent city score
5one Asia India 90.0
6two North America Canada NaN
7three Europe France 80.0
8four Europe Italy NaN
9five North America USA NaN
10six Europe Spain 70.0
4.2 行的获取
行可以通过iloc或loc属性按位置或名称的方式进行选取。
1>>> df.iloc[0]
2continent Asia
3city India
4score 90.0
5Name: one, dtype: object
6
7>>> df.loc['one']
8continent Asia
9city India
10score 90.0
11Name: one, dtype: object
1>>> data = {'city':['India','Canada','France','Italy','USA','Spain'],
2 'continent':['Asia','North America','Europe','Europe','North America','Europe'],
3 'score':[90,80,50,70,60,40]}
4
5>>> df = pd.DataFrame(data)
6>>> df
7
8 city continent score
90 India Asia 90
101 Canada North America 80
112 France Europe 50
123 Italy Europe 70
134 USA North America 60
145 Spain Europe 40
15
16>>> df.head()
17
18 city continent score
190 India Asia 90
201 Canada North America 80
212 France Europe 50
223 Italy Europe 70
234 USA North America 60
24
25
26>>> df.tail()
27
28 city continent score
291 Canada North America 80
302 France Europe 50
313 Italy Europe 70
324 USA North America 60
335 Spain Europe 40
本篇文章来源于微信公众号: 码农设计师