利用pandas读入数据时,经常是通过pd.read_excel(r'path.xlsx')但有时,可能只需要表格中的某些列,当读入整张表格后,再通过索引选取需要的列,例如某个数据处理过程可能只需要['班级', '姓名', '语文']这三列数据。
按以前的习惯代码可能就写成如下:
import pandas as pd
df = pd.read_excel(r'成绩.xlsx')
new_df = df[['班级', '姓名', '语文']]
其实可以通过设置pd.read_excel()的参数直接实现,这样如果数据量很大时,还可以省下很多内存。(可通过sys模块中getsizeof(o)查看对象所占内存)
import pandas as pd
df = pd.read_excel(r'成绩.xlsx', usecols=range(3))
在处理数据时,了解其自身参数,并充分利用,可以带来一些好处,比如节省内存等等,那下面的介绍将从3个方面去介绍:
- 如何设置参数选取特定列
- 如何设置参数选取特定行
- 关于数据转换的一些参数
1.usecols的取值可以是哪些类型?
usecols值可以为:(None, str , list, callable)
None:默认值,返回所有列
str:‘A:C' 或者 ’A,B,C' ,excel中所选取的列所对应的字母
df = pd.read_excel(r'成绩.xlsx', usecols='A:C'**)
list:可以为列数的集合或者列名的集合
df = pd.read_excel(r'成绩.xlsx', usecols=[0,1,2]**)
df = pd.read_excel(r'成绩.xlsx', usecols=['班级', '姓名', '语文']**)
callable:函数,返回列名符合某些条件的那些列,比如返回**列名**中包含语文和数学的那些列
df = pd.read_excel(r'成绩.xlsx', usecols=lambda x: x in ['班级', '姓名', '语文']) # 有点类似apply的意思
备注:0.24版本之前,int:表示选取前**int+1**列,0.24之后被舍弃了,可以用[0,1,2,..,int]或者range(0, int+1)
2. 了解完了选取某些列之外,那关于如何选取某些行的参数有3个:
nrows: int,表示选取前n行
df = pd.read_excel(r'成绩.xlsx', nrows=1)
skipfooter:int,表示从最后一行开始,不读取n行
df = pd.read_excel(r'成绩.xlsx', skipfooter=2) # 表示
skiprows: list-like,表示不读取某些行
df = pd.read_excel(r'成绩.xlsx', skiprows=range(1, 100, 2)) # 只读取偶数行
3.除了以上关于行或列的操作,还有一些数据转换的参数:
dtype: 转换某些列的数据类型
type_name: 设置所有的列为type_name,若出现不能转换的类型,会报错;
df = pd.read_excel(r'成绩.xlsx', dtype=int) # 会报错,因为不能将字符串转换成int
字典:{col _ name: type _ name,...}
df = pd.read_excel(r'成绩.xlsx', dtype={'班级': str, '数学': float})
convert_float:是否将float类型的整型(20.00)转换成int类型(20),默认值为True
备注:若某列数字包含真正的浮点数比如(20.01),那么该列将不会被转换(参考下图)
df = pd.read_excel(r'成绩.xlsx', convert_float=True)
df = pd.read_excel(r'成绩.xlsx', convert_float=False)
parse_dates与date_parser:通过设置parse_dates参数,可以在数据读入的时候将字符串格式的数据转换成日期格式;而date_parser参数则是进行日期转换的引擎(或者叫函数)
parse_dates:
布尔值:值为True,解析index列
列表:列名或者列数--['col_name','col_name',..] or ['col_num1, col_num2,...] ,同时将多列字符串格式转换成日期格式
列表:列表的列表 ---[['col_name','col_name2']] or [['col_num','col_num2']],将列表中的多列,合并一个日期格式
字典:{'str': ['col_name','col_name2',..]} 为新合并的日期列指定一个新的列名'col_name'
date_parser:function,默认调用dateutil.parser.parser 进行解析日期,具体解析哪些列取决于parse_dates指定的参数。因为此值可以为函数,所以可以进行自定义。
例如:如下格式的日期,利用data_parser的默认值并不能进行成功转换,所以可以date_parser 结合 pd.to_datetime()进行定义函数可以进行转换
df = pd.read_excel(r'日期.xlsx', parse_dates=['date'], date_parser=lambda x: pd.to_datetime(x, format='%Y%m')
converters: 当然了,上述日期转换也可以通过设置converters也可以实现:converters意思就是将某个函数应用到某列上。
df = pd.read_excel(r'日期.xlsx', sheet_name='Sheet1', converters={'date': lambda x: pd.to_datetime(x, format='%Y%m')})
至此,本篇文章涉及到了以下几个方面:
- 如何选取某些特定的列,其所用到的参数为:usecols
- 如何选取某些特定的行,其所用到的参数为: skipfooter, skiprows, nrows
- 数据格式的设定:dtype 与 convert_float
- 日期格式的转换: parse_dates 与 date_parser
- 某些特定列的各种转换:converters(包括日期,数据类型等)
关于pd.read_excel()其他的参数您可以参考: