上一期对于pandas的数据结构以及基本的增查删改进行了简单的介绍,这一期接着利用pandas进行读写文件。
利用pandas读取文件主要用到的函数是read_xx(),读取后数据结构为dataframe,接下来对read_xx()进行一一讲解。
pd.read_excel()可以用来读取excel文件,主要涉及到的参数有:
(1)sheet_name: excel文件中的表名
(2)index_col: 使用哪一列作为行索引,默认从0开始
(4)usecols: 读取表格中哪几列,必须是位置索引
(5)header: 哪一行设置为列索引,默认是第一行,即header = 0
(6)date_parser:解析日期的函数
(7)parse_dates:尝试将数据解析为日期,默认为False。如果为True,则尝试解析所有列。此外,还可以指定需要解析的一组列号或者列名
(8)names: 列索引
(9)engine: 默认是C,如文件路径存在中文时,engine= "python"
(10)encoding: 默认是utf-8,还可以是gbk
(11)skiprows: 跳过前几行读取文件,默认从0开始
(12)nrows: 读取多少行数据
(13) converters: 列名跟函数之间的映射关系组成的字典
import pandas as pd
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",sheet_nam = 0,index_col = 0,nrows = 5)
print(df)
性别 年龄 省内省外 消费金额 贷款与否
用户id
1 男 60 1 311.0 0
2 NaN 25 1 220.0 1
3 男 47 1 246.0 0
4 女 52 0 NaN 0
5 女 21 0 916.0 0
sheet_name用来指定读取文件中哪个表格,可以是表格的名字或者是表格所在的位置,默认从0开始;
index_col指定用哪一列作为行索引,可以是具体的列名,也可以是列的位置索引,默认从0开始;
nrows就不用多说了,只读取多少行,为了方便查看数据的结构,示例只读取5行。
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",index_col = "用户id",usecols = [0,1,2,4,5],nrows = 5)
print(df)
性别 年龄 消费金额 贷款与否
用户id
1 男 60 311.0 0
2 NaN 25 220.0 1
3 男 47 246.0 0
4 女 52 NaN 0
5 女 21 916.0 0
usecols指定读取列,须是列的位置索引,默认从0开始;
header指定哪一行设置为列索引,默认为0,还可以是1或者None;
#以header = 0,以第一行为列索引
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",header = 0,nrows = 5)
print(df)
用户id 性别 年龄 省内省外 消费金额 贷款与否
0 1 男 60 1 311.0 0
1 2 NaN 25 1 220.0 1
2 3 男 47 1 246.0 0
3 4 女 52 0 NaN 0
4 5 女 21 0 916.0 0
#以header = 1,以第二行为列索引
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",header = 1,nrows = 5)
print(df)
1 男 60 1.1 311 0
0 2 NaN 25 1 220.0 1
1 3 男 47 1 246.0 0
2 4 女 52 0 NaN 0
3 5 女 21 0 916.0 0
4 6 男 37 0 980.0 1
header = None,表明不以表格的行为列索引,即没有表头,默认从0开始,如原来表格有列索引,则原来索引变为第一行数据;
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",header = None,nrows = 5)
print(df)
0 1 2 3 4 5
0 用户id 性别 年龄 省内省外 消费金额 贷款与否
1 1 男 60 1 311 0
2 2 NaN 25 1 220 1
3 3 男 47 1 246 0
4 4 女 52 0 NaN 0
列名的设置,可以通过header = None搭配names参数来重设,或者header = None搭配df.columns()来设置;
skiprows,跳过前几行读取;
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",header = None,nrows = 5,skiprows = 1,names = ["用户id","性别","年龄","省内外情况","消费情况","贷款情况"])
print(df)
用户id 性别 年龄 省内外情况 消费情况 贷款情况
0 1 男 60 1 311.0 0
1 2 NaN 25 1 220.0 1
2 3 男 47 1 246.0 0
3 4 女 52 0 NaN 0
4 5 女 21 0 916.0 0
因为原来的表格有表头,因此用header = None时,原来的表头会变成第一行数据,因此使用skiprows =1,跳过了第一行的读取。
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",header = None,nrows = 5,skiprows = 1)
df.columns = ["用户id","性别","年龄","省内外情况","消费情况","贷款情况"]
print(df)
用户id 性别 年龄 省内外情况 消费情况 贷款情况
0 1 男 60 1 311.0 0
1 2 NaN 25 1 220.0 1
2 3 男 47 1 246.0 0
3 4 女 52 0 NaN 0
4 5 女 21 0 916.0 0
csv文件是以逗号为分隔符的文件,读取参数与excel基本类似,与excel的读取不一样的地方在于如遇到中文路径必须得设置engine参数;
文件为gbk格式的csv,若不设置encoding参数,会报错,并且文件路径带有中文,需要设置engine参数,不然也会报错;
df = pd.read_csv(r"D:\迅雷下载\示例gbk.csv",encoding = "gbk",engine = "python")
print(df)
用户id 性别 年龄 省内省外 消费金额 贷款与否
0 1 男 60.0 1 311.0 0.0
1 2 NaN 25.0 1 220.0 1.0
2 3 男 47.0 1 246.0 0.0
3 4 女 52.0 0 NaN 0.0
4 5 女 21.0 0 916.0 0.0
5 6 男 37.0 0 980.0 1.0
6 7 男 34.0 0 482.0 1.0
7 8 男 NaN 0 267.0 0.0
8 9 女 50.0 1 NaN 0.0
9 10 男 20.0 1 265.0 1.0
10 11 男 51.0 1 612.0 0.0
11 12 男 31.0 0 704.0 0.0
12 13 女 NaN 0 529.0 1.0
13 14 女 18.0 1 528.0 1.0
14 15 女 22.0 0 328.0 NaN
15 16 女 45.0 0 647.0 0.0
16 17 NaN 52.0 0 860.0 0.0
17 18 男 50.0 1 779.0 0.0
18 19 男 59.0 0 750.0 1.0
19 20 男 23.0 0 597.0 0.0
encoding默认是utf-8格式,根据需要还可能是gbk,示例就是gbk格式;
engine指定读取引擎,默认是c语言,如有路径有中文,需设置为python,python引擎更为全面;
txt文件是以指制表符\t为分隔符的文件,读取时用到read_table来读取,参数与excel、csv基本类似,不同的地方在于必须要指定sep。
df = pd.read_csv(r"D:\迅雷下载\示例txt.txt",encoding = "gbk",engine = "python",sep = "\t",nrows= 5,index_col = "用户id")
print(df)
性别 年龄 省内省外 消费金额 贷款与否
用户id
1 男 60 1 311.0 0
2 NaN 25 1 220.0 1
3 男 47 1 246.0 0
4 女 52 0 NaN 0
5 女 21 0 916.0 0
excel,csv,txt写入文件的方式基本类似,以pandas的to_xx()方式写入;因为三者类似,这里只用excel格式来示例。
(1)index: 是否保留行索引
(2)columns: 通过列索引指定所需列
(3)sheet_name: 表名
(4)encoding:编码格式,utf-8或者gbk
(5)na_rep: 缺失值填充
(6)inf_rep:无穷值填充
(7)index_label: 行索引标签
(8)header: 默认为True,False没有列索引,如需更改列名,则header = ["列1","列2","列3"]
df = pd.read_excel(r"D:\迅雷下载\示例.xlsx",sheet_nam = 0,nrows = 5)
df.to_excel(r"C:\Users\wenjianhua\Desktop\示例20190322.xlsx",index = False,columns = ["用户id","性别","消费金额","贷款与否"],
encoding = "utf-8",sheet_name = "示例",na_rep = "Na",inf_rep = "Na")
to_csv时需记得设置sep参数!
多个数据表需同时写入一个文件时,需用到pandas的ExcelWriter。 步骤如下:
writer = pd.ExcelWriter(path,engine = "xlsxwriter")
df1.to_excel(writer,sheet_name = "XX")
df2.to_excel(writer,sheet_name = "XX")
df3.to_excel(writer,sheet_name = "XX")
writer.save()
##我们举例说明一下
df1 = pd.read_excel(r"D:\迅雷下载\示例.xlsx",sheet_nam = 0,nrows = 5)
df2 = pd.read_excel(r"D:\迅雷下载\示例.xlsx",sheet_nam = 0,nrows = 5)
df3 = pd.read_excel(r"D:\迅雷下载\示例.xlsx",sheet_nam = 0,nrows = 5)
writer = pd.ExcelWriter(r"D:\迅雷下载\示例1.xlsx",engine = "xlsxwriter")
df1.to_excel(writer,sheet_name = "示例1")
df2.to_excel(writer,sheet_name = "示例2")
df3.to_excel(writer,sheet_name = "示例3")
writer.save()
很多时候我们会遇到数据表结构类似,甚至结构相同的文件。处理时如果一个一个的读取,那就太慢了,不符合使用python的我们的风格,我们可以使用循环将多个类似的数据表同时读取,如:
import os
import pandas as pd
frame = []
path = r"C:\Users\wenjianhua\Desktop\example"
for file in os.listdir(path):
filepath = path + "\\" + file
print(filepath)
frame.append(pd.read_csv(filepath,usecols = [0,1,2,3]))
df = pd.concat(frame,ignore_index = True)
print(df.head(10))
C:\Users\wenjianhua\Desktop\example\order-14.3.csv
C:\Users\wenjianhua\Desktop\example\order.csv
商品ID 类别ID 门店编号 单价
0 30006206 915000003 CDNL 25.23
1 30163281 914010000 CDNL 2.00
2 30200518 922000000 CDNL 19.62
3 29989105 922000000 CDNL 2.80
4 30179558 915000100 CDNL 47.41
5 30022232 960000000 CDNL 0.30
6 30179520 915000100 CDNL 77.52
7 30184351 915000106 CDNL 15.57
8 30184351 915000106 CDNL 15.58
9 29989059 922000003 CDNL 1.98