序列与数据框的构造
构造序列
方法:
- 通过同质的列表或元组创建
- 通过字典构建
- 通过Numpy中的一维数组构建
- 通过数据框DataFrame中的某一列构建
下面代码通过Series函数将列表字典和一维数组转换为序列。该样式会产生两列,第一列属于序列的行索引,自动从0开始,第二列是序列的实际值。不股票通过字典构造的序列第一列是字典的键,第二列是字典的值。
# 导入模块
import pandas as pd
import numpy as np
# 构造序列
gdp1 = pd.Series([2.8,3.01,8.99,8.59,5.18])
gdp2 = pd.Series({'北京':2.8,'上海':3.01,'广东':8.99,'江苏':8.59,'浙江':5.18})
gdp3 = pd.Series(np.array((2.8,3.01,8.99,8.59,5.18)))
print(gdp1)
print(gdp2)
print(gdp3)
# 运行结果
0 2.80
1 3.01
2 8.99
3 8.59
4 5.18
dtype: float64
北京 2.80
上海 3.01
广东 8.99
江苏 8.59
浙江 5.18
dtype: float64
0 2.80
1 3.01
2 8.99
3 8.59
4 5.18
dtype: float64
序列的处理方法
如果序列是行名称风格,既可以使用位置(行号)索引,又可以使用(行名称)索引;如果需要对序列进行数学函数的运算,一般首选numpy模块,因为Pandas模块在这方面比较匮乏。如果是对序列做统计运算,既可以使用numpy模块中的函数,也可以使用序列的“方法”。
# 取出gdp1中的第一、第四和第五个元素
print('行号风格的序列:\n',gdp1[[0,3,4]])
# 取出gdp2中的第一、第四和第五个元素
print('行名称风格的序列:\n',gdp2[[0,3,4]])
# 取出gdp2中上海、江苏和浙江的GDP值
print('行名称风格的序列:\n',gdp2[['上海','江苏','浙江']])
# 数学函数--取对数
print('通过numpy函数:\n',np.log(gdp1))
# 平均gdp
print('通过numpy函数:\n',np.mean(gdp1))
print('通过序列的方法:\n',gdp1.mean())
# 运行结果
行号风格的序列:
0 2.80
3 8.59
4 5.18
dtype: float64
行名称风格的序列:
北京 2.80
江苏 8.59
浙江 5.18
dtype: float64
行名称风格的序列:
上海 3.01
江苏 8.59
浙江 5.18
dtype: float64
通过numpy函数:
0 1.029619
1 1.101940
2 2.196113
3 2.150599
4 1.644805
dtype: float64
通过numpy函数:
5.714
通过序列的方法:
5.714
构造数据框
数据框实际上就是一个数据集,数据集的行代表每一条观测,数据集的列则代表各个变量。在一个数据框中可以存放不同数据类型的序列,如整数型、浮点型、字符型和日期时间型,而数组和序列则没有这样的优势,因为它们只能存放同质数据。
构造方法
- 通过嵌套的列表或元组构造
- 通过字典构造
- 通过二维数组构造
- 通过外部数据的读取构造
构造数据框需要用到Pandas模块中的DataFrame函数,注意:将嵌套列表、元组或二维数组转换为数据框时,数据框是没有具体的变量名的,只有从0到N的列号。所以,如果需要手工构造数据框,一般首选字典方法。
# 构造数据框
df1 = pd.DataFrame([['张三',23,'男'],['李四',27,'女'],['王二',26,'女']])
df2 = pd.DataFrame({'姓名':['张三','李四','王二'],'年龄':[23,27,26],'性别':['男','女','女']})
df3 = pd.DataFrame(np.array([['张三',23,'男'],['李四',27,'女'],['王二',26,'女']]))
print('嵌套列表构造数据框:\n',df1)
print('字典构造数据框:\n',df2)
print('二维数组构造数据框:\n',df3)
# 运行结果
嵌套列表构造数据框:
0 1 2
0 张三 23 男
1 李四 27 女
2 王二 26 女
字典构造数据框:
姓名 年龄 性别
0 张三 23 男
1 李四 27 女
2 王二 26 女
二维数组构造数据框:
0 1 2
0 张三 23 男
1 李四 27 女
2 王二 26 女
外部数据的读取
文本文件的读取
如果需要使用Python读取txt或csv格式的数据,可以使用Pandas模块中的read_table函数或read_csv函数。这里的“或”并不是指每个函数只能读取一种格式的数据,而是这两种函数均可以读取文本文件的数据。
read_table函数示例:

图中所展示的txt格式数据存在一些常见问题
- 数据并不是从第一行开始,前面实际上是数据集的来源说明。
- 数据末尾也不是需要读入的数据
- 中间部分的数据,第四行前加了#号,表示不需要读取该行,该如何处理
- 数据中的收入一列千位符是&,如何读入为正常的数值型数据
- 如果需要将year、month和day三个字段解析为新的birhday字段该如何做
- 数据集中含有中文,一般在读取含中文的文本文件时都会出现编码错误,该如何解决
针对这个数据集,写出如下代码
read_table函数参数说明:
参数说明:
文件名;
header:是否需要将原数据集中的第一行作为表头,默认将第一行作为字段名称
names:如果原数据集中没有字段,可以通过该参数在数据读取时给数据框添加具体的表头
index_col:指定原数据集中的某些列作为数据框的行索引(标签)
usecols:指定需要读取原数据集中的哪些变量名
dtype:读取数据时,可以为原数据集的每个字段设置不同的数据类型
converters:通过字典格式,为数据集中的某些字段设置转换函数
nrows:指定读取数据的行数
na_values:指定原数据集中的哪些特征的值作为缺失值
skip_blank_lines:读取数据时是否需要调过原数据集中的空白行,默认为True
seq:指定原数据集中个字段之间的分隔符,默认为tab制表符
parse_dates:如果参数值为True,尝试解析数据框的行索引;如果参数为列表尝试解析对应的日期列;如果参数为嵌套列表,则将某些列合并为日期列;如果参数为字典,则解析对应的列(字典中的值),并生成新的字段名(字典中的键);
skiprows:数据读取时,指定要跳过原数据集开头的行数
skipfooter:数据读取时,指定需要跳过原数据集末尾的行数
comment:指定注释符,在读取数据时,如果碰到行首指定的注释符,则跳过改行
encoding:如果文件中含有中文,有时需要指定字符编码
thousands:指定原始数据集中的千位符
engine:增加函数的引擎参数 例:engine="python"
user_income = pd.read_table('data_test01.txt', sep = ',',
parse_dates={'birthday':[0,1,2]},skiprows=2, skipfooter=3,
comment='#', encoding='utf-8', thousands='&',engine='python')
print(user_income)
# 运行结果
birthday gender occupation income
0 1990-03-07 男 销售经理 6000
1 1989-08-10 女 化妆师 8500
2 1992-10-07 女 前端设计 6500
3 1985-06-15 男 数据分析师 18000
电子表格的读取
需要用到read_excel函数
read_excel参数说明
io:指定电子表格的具体路径
sheetname:指定需要读取电子表格中的第几个sheet,既可以传递整数也可以传递名称
skiprows:读取数据时,指定跳过的开始行数
skip_footer:读取数据时,指定跳过的末尾行数
index_col:指定哪些列用作数据框的行索引(标签)
names:如果原数据集中没有字段,可以通过该参数在数据读取时给数据框添加具体的表头。
parse_cols:制定需要解析的字段
parse_dates:如果参数设置为True,则尝试解析数据框的行索引,如果参数为列表,则尝试解析对应的日期列;如果参数为嵌套列表,则某些列合并为日期列;如果参数为字典,则解析对应的列(字典中的值),并生成新的字段名(字典中的键)
na_values:指定原始数据中那些特殊值代表了缺失值
thousands:指定原始数据集中的千位符
convert_float:默认将所有的数值型字段转换为浮点型字段
converters:通过字典的形式,指定某些列需要转换的形式
函数示例:
excel文件内容如图,该数据集反映的是儿童类服装的产品信息。在读取数据时需要注意两点:一、该表没有表头,如何读取时就设置好具体的表头;二、数据集的第一列实际上是字符型的字段,如何避免数据读入时自动变成数值型字段

child_cloth = pd.read_excel(io='data_test02.xlsx',header=None,
converters{0:str},names{'Prod_Id','Prod_Name','Prod_Color','Prod_Price'})
print(child_cloth)
# 运行结果
Prod_Color Prod_Id Prod_Name Prod_Price
0 00101 儿童裤 黑色 109
1 01123 儿童上衣 红色 229
2 01010 儿童鞋 蓝色 199
3 00100 儿童内衣 灰色 159
这里的重点是converters参数,通过该参数可以指定某些变量需要转换的函数。
数据库数据的读取
数据库的连接
1.pymysql中的connect函数
import pymysql
'''参数说明
host:指定需要访问的Mysql服务器
user:指定访问Mysql数据库的用户名
password:指定访问Mysql数据库的密码
database:指定访问Mysql数据库的具体库名
port:指定访问Mysql数据库的端口号
charset:指定读取Mysql数据库的字符集,如果数据库中含有中文,一般可以设置为utf8或gbk
'''
pymysql.connect(host=None,user=None,password='',database=None,port=0,charset='')
# 连接数据库
conn = pymysql.connect(host='',user='',password='',database='',port=3306,charset='utf8')
# 读取数据
data = pd.read_sql('select * from me',conn)
# 关闭数据库连接
conn.close()
# 输出数据
print(data)
2.pymssql中的connect函数
从两个模块的connect函数看,两者几乎没有差异,参数含义也是一致的,不同的是pymysql模块中的connect函数的host参数表示需要访问的服务器,而pymssql函数中对应的参数是server。
# 连接数据库
conn = pymssql.connect(server='localhost',user='',password='',database='train',charset='utf8')
如上所示,由于访问SQL Server不需要填入用户名密码,因此user和password参数需要设置为空字符。
数据类型转换及描述统计
下面以某平台二手车信息为例

如果只需要读取数据的几行信息,可以使用head方法和tail方法:head方法返回数据集的开头5行,tail方法返回数据集的末尾5行。
如果想知道数据集有多少观测和多少变量,以及每个变量是什么数据类型,可以使用如下方法:
# 导入模块
import pandas as pd
# 数据读取
sec_cars = pd.read_table('sec_cars.csv',sep=',')
# 预览数据的前五行
print(sec_cars.head())
# 预览数据的后五行
print(sec_cars.tail())
# 查看数据的行列数
print('数据集的行列数:\n',sec_cars.shape)
# 查看数据集每个变量的数据类型
print('各变量的数据类型:\n',sec_cars.dtypes)
# 运行结果
Brand Name ... Sec_price New_price
0 众泰 众泰T600 2016款 1.5T 手动 豪华型 ... 6.8 9.42万
1 众泰 众泰Z700 2016款 1.8T 手动 典雅型 ... 8.8 11.92万
2 众泰 大迈X5 2015款 1.5T 手动 豪华型 ... 5.8 8.56万
3 众泰 众泰T600 2017款 1.5T 手动 精英贺岁版 ... 6.2 8.66万
4 众泰 众泰T600 2016款 1.5T 手动 旗舰型 ... 7.0 11.59万
[5 rows x 7 columns]
Brand Name ... Sec_price New_price
10979 DS DS 3 2012款 1.6L 手自一体 风尚版 ... 10.80 23.86万
10980 DS DS 3 2012款 1.6L 手自一体 风尚版 ... 9.50 23.86万
10981 DS DS 5LS 2015款 1.6T 手自一体 THP160雅致版 ... 12.30 20.28万
10982 DS DS 5 2015款 1.8T 手自一体 THP200 豪华版 ... 17.99 28.65万
10983 DS DS 6 2016款 1.6T 豪华版THP160 ... 16.00 24.95万
[5 rows x 7 columns]
数据集的行列数:
(10984, 7)
各变量的数据类型:
Brand object
Name object
Boarding_time object
Km(W) float64
Discharge object
Sec_price float64
New_price object
dtype: object
结果如上,该数据集一共包含10984条记录和七个变量,除二手车价格Sec_price和行驶里程数Km(W)为浮点数之外,其他变量均为字符型变量。但是,从数据看,二手车的上牌时间Boarding_time应该为日期型,新车价格New_price应该为浮点型,所以需对这两个变量进行类型的转换,操作如下:
# 修改二手车上牌时间的数据类型
sec_cars.Boarding_time = pd.to_datetime(sec_cars.Boarding_time,format='%Y年%m月')
# 修改二手车新车价格的数据类型
sec_cars.New_price = sec_cars.New_price.str[:-1].astype('float')
# 查看数据集每个变量的数据类型
print('各变量的数据类型:\n',sec_cars.dtypes)
# 运行结果
各变量的数据类型:
Brand object
Name object
Boarding_time datetime64[ns]
Km(W) float64
Discharge object
Sec_price float64
New_price float64
dtype: object
结果如上所示,注意:Pandas模块中的to_datetime函数可以通过format参数灵活的将各种格式的字符型日期转换为真正的日期数据类型;由于二手车新车价格含有“万”字,因此不能直接转换数据类型,所以需要首先通过str方法将该字段转换为字符串,然后通过切片,将“万”字删除,最后用astype方法,实现数据类型的转换。
返回数据的描述性分析:describe方法
# 返回数据的描述性分析
print(sec_cars.describe())
# 运行结果
Km(W) Sec_price New_price
count 10984.000000 10984.000000 10984.000000
mean 6.266357 25.652192 51.326006
std 3.480678 52.770268 79.682066
min 0.020000 0.650000 2.910000
25% 4.000000 5.200000 16.050000
50% 6.000000 10.200000 26.690000
75% 8.200000 23.800000 52.210000
max 34.600000 808.000000 976.920000