python3使用pandas读取excel文件

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


excel.jpg

刚开始我是这么做的

# 首先导入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值被转换成了''空字符串

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容