1.md 15.0 KB
Newer Older
W
wizardforcel 已提交
1
# 一、处理不同种类的数据集
W
wizardforcel 已提交
2

W
wizardforcel 已提交
3
在本章中,我们将学习如何在 Pandas 中使用不同种类的数据集格式。 我们将学习如何使用 Pandas 导入的 CSV 文件提供的高级选项。 我们还将研究如何在 Pandas 中使用 Excel 文件,以及如何使用`read_excel`方法的高级选项。 我们将探讨其他一些使用流行数据格式的 Pandas 方法,例如 HTML,JSON,PKL 文件,SQL 等。
W
wizardforcel 已提交
4 5 6

# 从 CSV 文件读取数据时使用高级选项

W
wizardforcel 已提交
7
在本部分中,我们将 CSV 和 Pandas 结合使用,并学习如何使用`read_csv`方法读取 CSV 数据集以及高级选项。
W
wizardforcel 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

# 导入模块

首先,我们将使用以下命令导入`pandas`模块:

```py
import pandas as pd
```

要读取 CSV 文件,我们使用`read_csv`方法,如下所示:

```py
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1")
df.head()
```

W
wizardforcel 已提交
24
为了执行基本导入,请将数据集的文件名传递给`read_csv`,并将结果数据帧分配给变量。 在以下屏幕截图中,我们可以看到 Pandas 已将数据集转换为表格格式:
W
wizardforcel 已提交
25 26 27

![](img/cfe3ed2e-29c2-480d-8033-c65564c39388.png)

W
wizardforcel 已提交
28
# 高级读取选项
W
wizardforcel 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

在 Python 中,pandas 具有`read_csv`方法的许多高级选项,您可以在其中控制如何从 CSV 文件读取数据。

# 处理列,索引位置和名称

默认情况下,`read_csv`将 CSV 文件第一行中的条目视为列名。 我们可以通过将`header`设置为`None`来关闭此功能,如以下代码块所示:

```py
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", header=None)
df.head()
```

输出如下:

![](img/e1f24ca1-344b-4700-bb36-38a6102167a3.png)

# 指定另一行作为标题

您还可以通过将行号传递给`header`选项,从而从其他行(而不是默认的第一行)设置列名,如下所示:

```py
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", header=2)
df.head()

```

W
wizardforcel 已提交
55
输出如下:
W
wizardforcel 已提交
56 57 58 59 60

![](img/7bf7d1c8-8b22-4fe1-bdcf-82a45d868d85.png)

# 将列指定为索引

W
wizardforcel 已提交
61
默认情况下,`read_csv`在读取数据时分配一个默认的数字索引,该索引从零开始。 但是,您可以通过将列名传递给索引列选项来更改此行为。 然后,Pandas 会将索引设置为此列,如以下代码所示:
W
wizardforcel 已提交
62 63 64 65 66 67 68 69 70 71 72 73

```py
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", index_col='Title')
df.head()
```

在这里,我们传递了电影标题作为索引名称。 现在,索引名称为`Title`,而不是默认的数字索引,如以下屏幕截图所示:

![](img/478b7fde-0165-48fc-a2a6-9b8207751094.png)

# 选择要读取的列的子集

W
wizardforcel 已提交
74
我们还可以选择读取 CSV 文件中特定列的子集。 为此,我们将列名作为列表传递,以使用`columns`选项,如下所示:
W
wizardforcel 已提交
75 76 77 78 79 80 81 82 83 84

```py
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", usecols=['Title', 'Genre1'])
df.head()
```

前面的代码段的输出如下:

![](img/0f20610e-b198-4572-9084-ab850b82c096.png)

W
wizardforcel 已提交
85
# 处理缺失和不适用的数据
W
wizardforcel 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114

接下来,我们将看到如何通过读取 CSV 文件来处理丢失的数据。 默认情况下,`read_csv`认为缺少以下值并将其标记为`NaN`

![](img/c330d7f5-b1c0-4fc8-8fb2-d4bf7a5eb8a7.png)

但是,您可以添加到此列表。 为此,只需将要视为`NaN`的值列表传递给,如以下代码所示:

```py
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", na_values=[''])
```

# 选择是否跳过空白行

有时整行没有值; 因此,我们可以在读取数据时选择处理这些行。 默认情况下,`read_csv`会忽略空白行,但是我们可以通过将`skip_blank_lines`设置为`False`来关闭此行,如下所示:

```py
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", skip_blank_lines=False)
```

# 数据解析选项

我们可以通过读取 CSV 文件来选择跳过哪些行。 我们可以将行号作为列表传递给`skiprows`选项。 第一行的索引为零,如下所示:

```py
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", skiprows = [1,3,7])
df.head()

```

W
wizardforcel 已提交
115
输出如下:
W
wizardforcel 已提交
116 117 118 119 120

![](img/80076b18-0c73-4252-b86f-f088e6ed6dad.png)

# 从文件的页脚或结尾跳过行

W
wizardforcel 已提交
121
要从页脚或文件末尾跳过行,请使用`skipfooter`选项并传递一个数字,该数字指定要跳过的行数。 在以下代码中,我们通过了`2`。 如我们所见,在跳过最后两行之后,我们创建的上一个数据帧与我们创建的数据帧之间存在差异:
W
wizardforcel 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143

```py
df.tail(2)
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", skipfooter=2, engine='python')
df.tail(2)
```

以下屏幕截图显示了输出:

![](img/c874e464-2cf3-4677-9828-2202c05a536b.png)

# 读取文件的子集或一定数量的行

有时数据文件太大,我们只想看一下前几行。 我们可以通过将要导入的行数传递到`nrows`选项来做到这一点,如以下代码所示。 在这里,我们将`100`传递给`nrows`,然后`nrows`仅读取数据集中的前一百行:

```py
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", nrows=100)
df.shape
```

# 从 Excel 文件读取数据

W
wizardforcel 已提交
144
在本节中,我们将学习如何使用 Pandas 使用 Excel 数据来处理表格,以及如何使用 Pandas 的`read_excel`方法从 Excel 文件中读取数据。 我们将阅读并探索一个真实的 Excel 数据集,并使用 xplore 解析一些可用于解析 Excel 数据的高级选项。
W
wizardforcel 已提交
145

W
wizardforcel 已提交
146
熊猫内部使用 Python Excel 库`rd`从 Excel 文件中提取数据。 我们可以通过执行`conda install xlrd`来安装它。
W
wizardforcel 已提交
147

W
wizardforcel 已提交
148
首先,请确保命令行程序在安装前以管理员模式运行,如以下屏幕截图所示:
W
wizardforcel 已提交
149 150 151

![](img/aa1344e7-c572-4fdf-add1-89fc1e472e84.png)

W
wizardforcel 已提交
152
以下屏幕截图显示了我们将使用 Pandas 阅读和探索的 Excel 数据集:
W
wizardforcel 已提交
153 154 155

![](img/184c0d1e-e396-4c78-91af-0ba3ee54aaab.png)

W
wizardforcel 已提交
156
上一个屏幕截图是电影分级的集合,[可以在这里找到它](https://github.com/saipranava/IMDB)
W
wizardforcel 已提交
157

W
wizardforcel 已提交
158
# 基本的 Excel 读取
W
wizardforcel 已提交
159

W
wizardforcel 已提交
160
我们正在使用 Pandas 的`read_excel`方法读取此数据。 以最简单的格式,我们只是将想要的 Excel 数据集的文件名传递给`read_excel`方法。 pandas 将 Excel 文件中的数据转换为 Pandas 数据帧。 Pandas 内部为此使用 Excel `rd`库。 在这里,Pandas 已读取数据并在内存中创建了表格数据对象,我们可以在我们的代码中访问,浏览和操作,如以下代码所示:
W
wizardforcel 已提交
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175

```py
df = pd.read_excel('IMDB.xlsx')
df.head()

```

前一个代码块的输出如下:

![](img/2815fd21-3be7-4ffa-829b-85e735677409.png)

pandas 有很多高级选项,我们可以使用它们来控制应如何读取数据。如以下屏幕截图所示:

![](img/5a286568-dfd0-4d26-8ce9-1805adc4690b.png)

W
wizardforcel 已提交
176
# 指定应读取的工作表
W
wizardforcel 已提交
177

W
wizardforcel 已提交
178
要指定应读取的纸张,请将值传递给`sheetname`选项。 如下面的屏幕快照所示,我们只是传递`0`,它是 Excel 工作表中第一张工作表的索引值。 这非常方便,尤其是当我们不知道确切的工作表名称时:
W
wizardforcel 已提交
179 180 181 182 183 184

```py
df = pd.read_excel('IMDB.xlsx', sheetname=0)
df.head()
```

W
wizardforcel 已提交
185
输出如下:
W
wizardforcel 已提交
186 187 188

![](img/821fc1c4-66e5-4d78-8833-5a18bd54d4dd.png)

W
wizardforcel 已提交
189
# 从多张表读取数据
W
wizardforcel 已提交
190

W
wizardforcel 已提交
191
Excel 数据集文件附带数据和多个工作表。 实际上,这是许多用户更喜欢 Excel 而不是 CSV 的主要原因之一。 幸运的是,Pandas 支持从多张纸中读取数据。
W
wizardforcel 已提交
192

W
wizardforcel 已提交
193
# 查找工作表名称
W
wizardforcel 已提交
194 195 196 197 198 199 200 201

要找出工作表的名称,请将 Excel 文件传递到`ExcelFile`类,然后在结果对象上调用`sheet_names`属性。 该类将 Excel 文件中的图纸名称打印为列表。 如果我们想从名为`data-movies`的工作表中读取数据,它将类似于以下代码片段:

```py
xls_file = pd.ExcelFile('IMDB.xlsx')
xls_file.sheet_names
```

W
wizardforcel 已提交
202
接下来,我们在之前创建的 Excel 文件对象上调用`parse`方法,并传入我们想要读取的工作表名称。 然后我们将结果分配给两个单独的数据帧对象,如下所示:
W
wizardforcel 已提交
203 204 205 206 207 208 209

```py
df1 = xls_file.parse('movies')
df2 = xls_file.parse('by genre')
df1.head()
```

W
wizardforcel 已提交
210
现在,我们从两个单独的数据帧,中的两个工作表中获取数据,如以下屏幕截图所示:
W
wizardforcel 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235

![](img/51df758b-0331-47f7-9f5a-d53195e29b7f.png)

# 选择标题或列标签

默认情况下,pandas 会将列名称或标题设置为 Excel 文件中第一个非空白行的值。 但是,我们可以更改此行为。 在以下屏幕截图中,我们将值`3`传递给`header`选项,该选项告诉`read_excel`方法设置索引行`3`中的标题名称:

```py
df = pd.read_excel('IMDB.xlsx', sheetname=1, header=3)
df.head()
```

前面代码的输出如下:

![](img/12d7f628-5b08-4cfa-9919-306cca42da97.png)

# 没有标题

我们还可以告诉`read_excel`忽略标题并将所有行都视为记录。 只要 Excel 没有标题行,就很方便。 为此,我们将`header`设置为`None`和,如以下代码所示:

```py
df = pd.read_excel('IMDB.xlsx', sheetname=1, header=None)
df.head()
```

W
wizardforcel 已提交
236
输出如下:
W
wizardforcel 已提交
237 238 239

![](img/a1b88a66-420f-4bb6-ac46-103fd63509d4.png)

W
wizardforcel 已提交
240
# 在开头跳过行
W
wizardforcel 已提交
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284

要跳过文件开头的行,只需将`skiprows`设置为要跳过的行数,如以下代码所示:

```py
df = pd.read_excel('IMDB.xlsx', sheetname=1, skiprows=7)
```

# 在末尾跳过行

为此,我们使用`skip_footer`选项,如下所示:

```py
df = pd.read_excel('IMDB.xlsx', sheetname=1, ski_footer=10)
```

# 选择列

我们还可以选择只读取列的子集。 这是通过将`parse_cols`选项设置为数值来完成的,这将导致将列从`0`读取到我们设置解析列值的任何索引。 我们在这种情况下设置了`parse_cols=2`,它将读取 Excel 文件中的前三列,如以下代码片段所示:

```py
df = pd.read_excel('IMDB.xlsx', sheetname= 0, parse_cols=2)
df.head()
```

以下是输出:

![](img/cbc17e06-e0cb-4693-a19d-1d2e8101bc39.png)

# 列名

我们可以选择给列使用不同的名称,而不是标题行中提供的默认名称。 为此,我们将列名列表传递给`names`参数,如下所示:

```py
df = pd.read_excel('IMDB.xlsx', sheetname=0, parse_cols = 2, names=['X','Title',
   'Rating'], )
df.head()
```

在下面的屏幕截图中,我们将列名设置为读取时传递的名称:

![](img/cb689dbe-dff6-448e-ad42-896429b363f3.png)

# 读取数据时设置索引

W
wizardforcel 已提交
285
默认情况下,`read_excel`用数字索引标记零,从`0`开始。 我们可以将索引或行标签设置为更高的值或我们的选择。 为此,我们将数据集的列名传递给`index_col`选项。 在以下代码中,我们将索引设置为`Title`列:
W
wizardforcel 已提交
286 287 288 289 290 291

```py
df = pd.read_excel('IMDB.xlsx', sheetname=0, index_col='Title')
df.head()
```

W
wizardforcel 已提交
292
输出如下:
W
wizardforcel 已提交
293 294 295 296 297 298 299 300 301 302 303 304 305

![](img/75fb95a9-93d5-4196-aff7-d4bfa3c1541e.png)

# 读取时处理丢失的数据

`read_excel`方法有一个值列表,它将被视为丢失,然后将其设置为`NaN`。 我们可以在使用`na_values`参数传递值列表时添加此代码,如以下代码所示:

```py
df = pd.read_excel('IMDB.xlsx', sheetname= 0, na_values=[' '])
```

# 读取其他流行格式的数据

W
wizardforcel 已提交
306
在本节中,我们将探索 Pandas 的功能,以读取和使用各种流行的数据格式。 我们还将学习如何从 JSON 格式,HTML 文件和 PICKLE 数据集中读取数据,并且可以从基于 SQL 的数据库中读取数据。
W
wizardforcel 已提交
307 308 309

# 读取 JSON 文件

W
wizardforcel 已提交
310
JSON 是用于结构化数据的最小可读格式。 它主要用于在服务器和 Web 应用之间传输数据,以替代 XML,如以下屏幕快照所示:
W
wizardforcel 已提交
311 312 313

![](img/c67f9d24-a64c-43d4-9f07-d5eccf714d35.png)

W
wizardforcel 已提交
314
# 将 JSON 数据读入 Pandas
W
wizardforcel 已提交
315

W
wizardforcel 已提交
316
为了读取 JSON 数据,pandas 提供了一种名为`read_json`的方法,其中我们传递了要读取的 JSON 数据文件的文件名和位置。 文件位置可以是本地文件,甚至可以是具有有效 URL 方案的互联网。 我们将结果数据帧分配给变量`DF`
W
wizardforcel 已提交
317

W
wizardforcel 已提交
318
`read_json`方法读取 JSON 数据并将其转换为 Pandas 数据帧对象,即表格数据格式,如以下代码所示。 JSON 数据现在可以以数据帧格式轻松访问,可以更轻松地进行操作和浏览:
W
wizardforcel 已提交
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334

```py
movies_json = pd.read_json('IMDB.json')
movies_json.head()
```

上一个代码块将产生以下输出:

![](img/4a1818ca-391b-48cb-9593-35960d5553bf.png)

# 读取 HTML 数据

pandas 内部使用`lxml` Python 模块读取 HTML 数据。 您可以通过执行`conda install lxml`,从命令行程序安装它,如以下屏幕截图所示:

![](img/7b60aa19-d51d-43a7-bd80-bd26473a7a62.png)

W
wizardforcel 已提交
335
我们还可以从本地文件甚至直接从互联网导入 HTML 数据:
W
wizardforcel 已提交
336 337 338

![](img/5ef932a6-3683-46dd-ac95-62d223a07840.png)

W
wizardforcel 已提交
339
在这里,我们将 HTML 文件或 URL 的位置传递给`read_html`方法。`read_html`从 HTML 提取表格数据,然后将其转换为 Pandas 数据帧。 在以下代码中,我们以表格格式获取了从 HTML 文件提取的数据:
W
wizardforcel 已提交
340 341 342 343 344

```py
pd.read_html('IMDB.html')
```

W
wizardforcel 已提交
345
输出如下:
W
wizardforcel 已提交
346 347 348 349 350 351 352

![](img/86a8b673-bec2-4b09-82aa-a733b9ab7cdc.png)

# 读取 PICKLE 文件

酸洗是将任何类型的 Python 对象(包括列表,字典等)转换为字符串的一种方式。 这个想法是,该字符串包含在另一个 Python 脚本中重构对象所需的所有信息。

W
wizardforcel 已提交
353
我们使用`read_pickle`方法读取我们的 PICKLE 文件,如以下代码所示。 与其他数据格式一样,Pandas 根据读取的数据创建数据帧:
W
wizardforcel 已提交
354 355 356 357 358 359

```py
df = pd.read_pickle('IMDB.p')
df.head()
```

W
wizardforcel 已提交
360
输出如下:
W
wizardforcel 已提交
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385

![](img/db67347d-5356-40ff-a4ec-38485abb9f6b.png)

# 读取 SQL 数据

在这里,我们将从流行的数据库浏览器 SQLite 中读取 SQL 数据,可以通过执行以下命令进行安装:

```py
conda install sqlite
```

然后,我们将导入 SQLite Python 模块,如下所示:

```py
import sqlite3
```

然后,创建与您要从中读取数据的 SQLite DB 的连接,如下所示:

```py
conn = sqlite3.connect("IMDB.sqlite")
df = pd.read_sql_query("SELECT * FROM IMDB;", conn)
df.head()
```

W
wizardforcel 已提交
386
接下来,使用`read_sql_query`方法将您想要数据来自的 SQL 查询传递给 Pandas。 该方法读取数据并创建一个数据帧对象,如以下屏幕快照所示:
W
wizardforcel 已提交
387 388 389 390 391 392 393

![](img/32c75475-e20d-444a-8ea0-6ecfa43181f7.png) 

此演示使用了 SQLite 数据库,但您也可以从其他数据库读取数据。 为此,只需调用适当的 DB Python 模块即可。

# 从剪贴板读取数据

W
wizardforcel 已提交
394
要从剪贴板读取数据,请先复制一些数据。 在以下示例中,我们从电影数据集中复制了一个表:
W
wizardforcel 已提交
395 396 397

![](img/977c5f6c-2735-454e-8c8e-a9800074f7ed.png)

W
wizardforcel 已提交
398
接下来,使用 pandas 的`read_clipboard`方法读取数据并创建一个数据帧,如下所示:
W
wizardforcel 已提交
399 400 401 402 403 404

```py
df = pd.read_clipboard()
df.head()
```

W
wizardforcel 已提交
405
从网页复制的数据现在作为数据帧存储在内存中,如以下屏幕截图所示。 在将数据快速导入 Pandas 时,此方法非常方便:
W
wizardforcel 已提交
406 407 408

![](img/90b4fbce-54bd-483c-909f-055ceb2efdd8.png)

W
wizardforcel 已提交
409
# 总结
W
wizardforcel 已提交
410

W
wizardforcel 已提交
411
在本章中,我们学习了如何在 Pandas 中使用不同种类的数据集格式。 我们学习了在导入 CSV 文件时如何使用 Pandas 提供的高级选项。 我们还看到了如何使用 Excel 数据集,并且探讨了可用于处理各种数据格式(例如 HTML,JSON,PICKLE 文件,SQL 等)的方法。
W
wizardforcel 已提交
412

W
wizardforcel 已提交
413
在下一章中,我们将学习如何在高级数据选择中使用 Pandas 技术。