昨天在使用pandas读取excel的时候踩了很多坑,在这里写一篇博客,方便后来者少踩一些坑:
话不多说,上干货:
下图是我的excel:

刚开始我是这么做的
# 首先导入pandas库
import pandas as pd
datas = pandas.read_excel('test.xls',sheet_name=0,headers=0,index_col=0)
print('column:',datas.columns)
print('index:',datas.index)
print('row1:',list(datas.loc[1]))
print('row1:',list(datas.loc[2]))
简单说下这几个参数:
sheet_name是子表索引(从0开始),必须是整数;
headers是列索引,我这里是这张表第一行;
index_col是行索引,默认是excel默认的行数,不过我这张表有一个序号,所以我这里index_col=0;
输出结果:
column: Index(['姓名', '年龄', '体重', '爱好', '创建时间', '出生日期', '电话', '睡觉时间'], dtype='object')
index: Int64Index([1, 2, 3], dtype='int64', name='序号')
row1: ['chenh', 20, 63.0, '篮球', Timestamp('2019-02-21 06:10:30'), Timestamp('1999-01-12 00:00:00'), 1233211231, datetime.time(20, 50)]
row1: ['wangxm', 21, 60.7, nan, Timestamp('2019-02-22 06:15:30'), Timestamp('1998-02-12 00:00:00'), 1321211235, datetime.time(21, 40)]
这里可以看到 datas.columns是我们定义的第一行的内容,index是序号;另外还出现了一些对我来说不太友好的事情,有些值被改变了而结果不是我想要的;比如:
体重默认被转换成了float,日期被转换成了Timestamp类型,时间被转换成了datetime类型,空值被转换成了nan类型,这些都是pandas的数据类型,有些数据类型python无法识别,比如nan
接下来我寻找解决办法,发现了read_excel有一个参数dtype,这个参数可以传入字典来改变读取的值的类型,那么更改代码如下:
dtypes = {'电话':str,'体重':int,'爱好':str,'出生日期':str}
datas = pandas.read_excel('test.xls',sheet_name=0,headers=0,index_col=0,dtype=dtypes)
print('row1:',list(datas.loc[1]))
print('row1:',list(datas.loc[2]))
输出结果:
row1: ['chenh', 20, 63, '篮球', Timestamp('2019-02-21 06:10:30'), '1999-01-12 00:00:00', '1233211231', datetime.time(20, 50)]
row1: ['wangxm', 21, 60, nan, Timestamp('2019-02-22 06:15:30'), '1998-02-12 00:00:00', '1321211235', datetime.time(21, 40)]
可以看除,有些值得类型确实被改变了,体重变成了int类型,电话变成了str类型,出生日期变成了str类型,但是爱好第二行的nan值还是没有被改变
接着我们继续找方法,然后我看到了read_excel函数的keep_default_na参数,类型是bool值,默认是True,文档中是这么介绍的:
If na_values are specified and keep_default_na is False the default NaN values are overridden,
otherwise they’re appended to
大概意思是 如果指定了na_values且keep_default_na为False,则默认的NaN值将被覆盖,否则会用nan替换空值(英文水平很渣,理解错误请指正,我会回来改的,见谅,哈哈)
那么就来试试:
dtypes = {'电话':str,'体重':int,'爱好':str,'出生日期':str}
datas = pandas.read_excel('test.xls',sheet_name=0,headers=0,index_col=0,keep_default_na=False,na_values=['nan'],dtype=dtypes)
print('row1:',list(datas.loc[1]))
print('row1:',list(datas.loc[2]))
输出结果:
row1: ['chenh', 20, 63, '篮球', Timestamp('2019-02-21 06:10:30'), '1999-01-12 00:00:00', '1233211231', datetime.time(20, 50)]
row1: ['wangxm', 21, 60, '', Timestamp('2019-02-22 06:15:30'), '1998-02-12 00:00:00', '1321211235', datetime.time(21, 40)]
可以看到已经达到了我们理想的的数据了;
如果列数太多,而我指向要str类型,那么把dtype参数制定为'str'就可以了
datas = pandas.read_excel('test.xls',sheet_name=0,headers=0,index_col=0,keep_default_na=False,na_values=['nan'],dtype='str')
print('row1:',list(datas.loc[1]))
print('row1:',list(datas.loc[2]))
输出结果:
row1: ['chenh', '20', '63', '篮球', '2019-02-21 06:10:30', '1999-01-12 00:00:00', '1233211231', '20:50:00']
row1: ['wangxm', '21', '60.7', '', '2019-02-22 06:15:30', '1998-02-12 00:00:00', '1321211235', '21:40:00']
由于我在转换nan值的找了看了很多博客,所以除了上面的方法外还有另外的一些办法来转换nan值在这里也简单介绍一下:
datas = pandas.read_excel('test.xls',sheet_name=0,headers=0,index_col=0)
datas.fillna('',inplace=True) #第一个参数是以什么来替换nan值(这里是空字符串),第二个参数inplace如果不改成True的话nan值是不会改变的
print('row1:',list(datas.loc[1]))
print('row1:',list(datas.loc[2]))
输出结果:
row1: ['chenh', 20, 63.0, '篮球', Timestamp('2019-02-21 06:10:30'), Timestamp('1999-01-12 00:00:00'), 1233211231, datetime.time(20, 50)]
row1: ['wangxm', 21, 60.7, '', Timestamp('2019-02-22 06:15:30'), Timestamp('1998-02-12 00:00:00'), 1321211235, datetime.time(21, 40)]
可以看到nan值被转换成了''空字符串