Python数据分析与可视化
读取数据
- 含有逗号分隔符文件
- JSON文件
- 源文件
含有逗号分隔符文件
本节主要讲CSV类型的文件以及如何使用Pandas库来读取CSV文件。
- CSV文件的简介
- 用Pandas来读取CSV文件
CSV文件的简介
在机器学习中以逗号作为分隔符的文件很常见(CSV文件),这种类型的文件每一行都有数据,每行的数据元素之间通过通过逗号分隔,用Pandas可以很方便的读取这类文件。
用Pandas来读取CSV文件
这是详细的 [ 说明文档 ](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.read_csv.html) 在读取文件之前先了解一下三个参数
- sep-指定分隔符,如果不指定默认值是’,'支持自定义分隔符。
- header-指定作为整个数据集列名的行.如果数据集中没有列名,则需要设置header=None.对有表头的数据识别第一行作为header.
- names-用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。
如果CSV文件的格式比较好,那么参数采用默认值,就可以读取好。
虽然在不用Pandas的情况下也可以读取CSV文件,但是CSV文件的格式通常很混乱,读取他们通常会遇到很多难以处理的问题,Pandas模块具有许多参数,我们可以更改这些参数以处理更复杂的CSV文件。
用一段代码来说明
import pandas as pd
# 创建列名列表
names = ['age', 'workclass', 'fnlwgt', 'education', 'educationnum', 'maritalstatus', 'occupation', 'relationship', 'race',
'sex', 'capitalgain', 'capitalloss', 'hoursperweek', 'nativecountry', 'label']
# 利用定义好的列名来读取数据
df = pd.read_csv("data/adult.data", header=None, names=names)
print(df.head())
下面来解释一下代码,首先下载需要的数据( 数据下载地址
)进入到页面后点击Data
Folder,然后选择adult.data。下载好后,可以用Excel或者其他文本编辑器打开。可以看到每行的数据都是以逗号分隔开的,如下图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200724204559114.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NDA4OTM1,size_16,color_FFFFFF,t_70)
我们可以发现这个CSV文件没有列名。但是我们在第二行的代码中定义了列名,并把它传递给了names参数。在第三行代码中我们设置了header=None,这是由于,Pandas默认将第一行作为列名,这样设置后第一行就会作为正常数据进行展示。
数据读入后将转为Pandas的dataframe格式。
dataframe格式非常类似于数据矩阵,但他还有其他的特点。比如,我们可以获取指定名称的行和列,并且在每一列中可以存储不同的数据类型,比如某一列可以是整型,另外一列可以是文本型。
我们可以将dataframe格式看作是一张Excel数据表。例如,有一张工作表,这张表中一列是日期,另外一列是日期对应的温度。我就可以把这张表看作是dataframe格式.
通过调用head()函数,我们可以看到dataframe格式数据的前五行。在下一节“数据描述”中再详细讨论如何使用dataframe格式。
接下来,让我们看一下JSON文件的读取。
JSON文件
本节主要讲JSON类型的文件以及如何使用Pandas库来读取JSON文件。
- JSON文件介绍
- 读取JSON文件
JSON文件介绍
JSON (JavaScript Object
Notation)是一种流行的格式具有灵活的模式。人类也很容易读写。在网络上发送的许多数据都是以JSON传输的。下面JSON文件例子:
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
读取JSON文件
Python可以使用内置json库轻松地将这些数据从字符串读取为字典:
import json
## 将JSON对象定义为字符串
json_string = """{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}"""
# 读取JSON数据
json_data = json.loads(json_string)
print(json_data)
当定义的JSON数据是字符串时,我们可以使用该oads()函数将其读入Python中字典。JSON与字典的格式相同,它由各种类型的键,值对组成。上面的JSON对象具有一个名为title的键,其值是“example
glossary”。它还具有一个名为GlossList的键,该键具有一个字典值,这个值又包含其自己的键值对。我们可以将看到JSON是如何表示我们想要的任何类型的嵌套模式。
现在,我们可以将JSON对象作为字典,并且可以按照在上节中讨论的方法来访问值。如果文件中包含JSON数据,则可以使用load()函数读取数据。
如果有一个名为data.json的文件,则将按照以下方法进行操作:
with open('data.json') as f:
data = json.load(f)
现在我们熟悉了JSON文件的操作,下面讨论源文件的操作
源数据
本节主要讲源数据类型的文件以及如何使用Pandas库来读取源数据文件
- 源数据文件的介绍
- 源数据文件的读取
源数据文件的介绍
有时我们会得到奇怪格式的数据,并且必须自己写Python代码来处理数据。
例如,可能有一个用竖线(|)分隔的文件。它可能看起来像这样:
James|22|M
Sarah|31|F
Mindy|25|F
在上方,我们有3列数据,每行的3个值用竖线(|)分隔-分别代表名称,年龄和性别。
我们可以在Python中创建相同的文件并使用tempfile进行处理。
import tempfile
tmp = tempfile.NamedTemporaryFile()
# 将数据写入文件
with open(tmp.name, 'w') as f:
f.write("James|22|M\n")
f.write("Sarah|31|F\n")
f.write("Mindy|25|F")
# 逐行读取文件中的数据
with open(tmp.name, "r") as f:
for line in f:
print(line)
上面,我们使用tempfile创建了一个包含三行数据的文件。数据的前2行末尾的\ n让程序创建新行。
源数据文件的读取
我们要注意下面这段代码:
with open(tmp.name, "r") as f:
for line in f:
print(line)
我们使用open()命令来读取文件。首先传递要处理的文件名,然后传递r代表读取。
由于我们with
as功能,因此变量f代表文件句柄,并且仅在此范围内有用。这是读取文件的好习惯,因为我们不xu关闭文件句柄。有了文件句柄后,Python可以非常轻松地访问这些行。变量f现在是可迭代的,其中每个可迭代的都是文件的一行。因此,我们可以这样迭代:
for line in f
上面的代码仅打印出这些行,但是由于我们可以直接访问文件的每行数据,因此我们可以在处理过程中做任操作。例如,以下代码仅取每行的第一个值,并将它们添加到列表中。
import tempfile
tmp = tempfile.NamedTemporaryFile()
# 将数据写入文件
with open(tmp.name, 'w') as f:
f.write("James|22|M\n")
f.write("Sarah|31|F\n")
f.write("Mindy|25|F")
first_values = [] # 定义一个列表来存储每一行的第一个值
with open(tmp.name, "r") as f: # 打开要读的文件
for line in f: # 迭代每一行
row_values = line.split("|") # 以“|”切分
first_values.append(row_values[0]) # 将第一个值添加到列表中
print(first_values)