实际应用中,对数据进行处理时,到手的数据文件往往五花八门,data、txt、csv、json等等。Python为我们提供了强大的数据分析处理工具,如果文件符合某种格式要求,可以使用pandas模块中的各种read方法直接读取。例如大名鼎鼎的鸢尾花数据集iris.data,使用Notepad++打开文件观察数据,可见:
从图中可以看出,没有表头,字段清晰,分隔符均为逗号,因此可直接使用read_csv方法将数据读取为Dataframe对象,再通过Dataframe对象进行各种操作:
df = pd.read_csv('e:\iris.data',header=None)
# 查看数据前5行
df.head()
# 读取后100个数据的第2和第3列数据作为特征
X = df.iloc[-100:,[2,3]].values
# 读取后100个数据的第4列元素作为数据标签
y = df.iloc[-100:,4].values
如果遇到不这么标准的数据是否能够这样操作?例如这个StoneFlakes.dat:
文件中既包含表头又有数据字段,分隔符包括数量不等的空格、逗号以及空格+逗号,如果直接使用read_csv方法读取肯定无法准确的获取数据。解决办法就是直接使用open()方法对文件进行按行读取,再根据文件结构解析数据。如下:
import numpy as np
import pandas as pd
from pandas import DataFrame
datalist = []
columnlist = []
with open('e:\data\StoneFlakes.dat','r') as of:
# 获取第一行表头数据
firstline = of.readline()
# 删除字符串头尾的特定字符
firstline = firstline.strip('\n')
# 将字符串按照空格进行分割
columnlist = firstline.split()
按照该表格结构,第一行为表头数据,故首先使用open()方法打开文件,返回一个TextIOWrapper对象,使用其中的readline()方法返回一行文本数据,再使用strip()方法删除首尾可能存在的换行符或其他不需要的符号,最后使用split方法按照空格作为分割符将字符串分割为列表,从而获得表格的列名。之后可对数据进行读取。
for line in of:
# 清除前后回车符,按照空格进行分割
line = line.strip('\n').split()
由于数据中的分割符较为复杂,包含空格和逗号的各种组合,采取的策略是多次分割。通过对数据观察发现,大部分数据是以逗号作为分隔符,但是少量逗号分割符前面包含空格,同时第1列和第2列之间的分隔符均为数量不等的空格。所以对每一行文本,先以空格为分隔符进行分解,得到数量较少但长度较长的多个字段。同样先试用stripe(’\n’)方法除去首尾的换行符,再使用split()方法按照空格为分割符进行分割。此时得到的列表中的元素即为严格以逗号为分隔符的字符串,如下:
['ar', '?,35.30,2.60,', '?,42.4,24.2,47.1,69']
之后再按照逗号对每个字符串进行分割,最后将得到的多个列表串联,得到了包含该行所有数据元素的列表,如下:
linelist = []
for str in line:
# 按照‘,’进行分割
# 字符串前后可能还有',',需要先清除
linelist = linelist + (str.strip(',').split(','))
datalist.append(linelist)
由于有的字段是以逗号结尾,需要先试用strip(’,’)方法去除,再使用split(’,’)方法以逗号为分割符进行分割。得到每一行数据的列表后,通过append方法组合为一个二维的列表,结合之前获取的表头列表,用以构建Dataframe对象。如下
df = DataFrame(datalist, columns=columnlist)
df
ID LBI RTI WDI FLA PSF FSF ZDF1 PROZD
0 ar ? 35.30 2.60 ? 42.4 24.2 47.1 69
1 arn 1.23 27.00 3.59 122 0.0 40.0 40.0 30
2 be 1.24 26.50 2.90 121 16.0 20.7 29.7 72
3 bi1 1.07 29.10 3.10 114 44.0 2.6 26.3 68
4 bi2 1.08 43.70 2.40 105 32.6 5.8 10.7 42
.. ... ... ... ... ... ... ... ... ...
[79 rows x 9 columns]
此时得到Dataframe对象准确的包含了原始文件中的数据,满足进行下一步的操作要求。