Pandas笔记

centuryw4年前 (2019-02-21)Python100

官方文档

序列与数据框的构造

构造序列

方法:

  • 通过同质的列表或元组创建
  • 通过字典构建
  • 通过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

    发表评论

    访客

    看不清,换一张

    ◎欢迎参与讨论,请在这里发表您的看法和观点。