万壑松风知客来,摇扇抚琴待留声
简述:
前一篇文章简单描述了 Python 中 groupby 的几个小技巧,同时也开启了 Python_tips 系列的第一篇。刚过了没几天,这里又想到了一个问题(五一放假这几天电脑都没碰,有点惭愧。。。),一个平时爱用的 pandas方法 read_csv,但主要还是想说说其中的 chunksize、iterator 参数。但既然已经说到了这个函数,前面还是对其它的参数做一个简略分析和阐述,最后再重点描述读取大文件时使用的 chunksize、iterator 参数。
read_csv 的参数:
代码如下,从官网上省略了很多参数,这里只保留了我平常较多用到的一些参数做说明。合理适当的添加下面的参数,会在实际工作中减少很多时间和代码量。
1 | pandas.read_csv(filepath_or_buffer, sep=', ', header='infer', names=None, index_col=None, prefix=None, dtype=None, parse_dates=False, date_parser=None, iterator=False, chunksize=None, encoding=None) |
参数 sep:
read_csv 函数从形式上一眼能看出来就是读取 csv 文件,而 csv 文件保存的分隔符就是逗号 , ,参数 sep 用来指定读取文件时所使用的分隔符号,所以默认就是逗号 , 。当然也不仅限于默认分隔符,我们可以根据实际情况来指定分隔符,正确读取不同格式的文件:
1 | pd.read_csv(filepath, sep=',') |
参数 header:
用来指定读取文件的头信息(列名),默认 infer 为推断列名,推断从文件的第一行号下数据不为空开始。若该行值不为空,则作为数据的列名。若读取的文件只保留了数据没有列名,则可以指定 header=None ,自动生成新列名;若文件中有列名,则可以传参指定,传入的参数为 int 行号,如:
1 | pd.read_csv(filepath, header='infer') # 次序推断 |
参数 names:
和 header 参数类似用来确定列名,对于某些读取的文件没有列名,但我们希望能主观指定列名,那么就可以使用该参数。通过传入一个列表,其中列表包含列维度上等长值,以便给每列一个指定值。官方表示,如果使用该参数就意味着 header=None,最好明确传入:
1 | # 此时读取文件有 4 列数据 |
参数 index_col:
在使用默认 read_csv 读取文件时,会给读取的文件新生成一个行索引,从 0 开始的数字标签。但很多时候数据的行索引已经包含在内,并不需要新生成,所以这时候可以通过该参数指定使用哪一列作为行索引,参数为 int 型:
1 | pd.read_csv(filepath, index_col=False) # 新生成 0 开始的行索引 |
参数 prefix:
首字,添加在列名前,但需要配合 header 参数使用。当使用 header=None 同时指定 prefix 参数,那么就会为新生成的列名加前缀:
1 | # 添加前缀 X |
参数 dtype:
读取文件时,可以通过dtype参数来指定数据的类型。数据或列的数据类型。当数据有多列时,其中 a、b、c 三列我们需要重新指定类型,可以使用字典方法处理,如:dtype = {'a':'np.float64', 'b':'object', 'c':'Int64'} 。如果需要统一指定所有列类型,可以直接 dtype = 'object' 。
1 | pd.read_csv(filepath, dtype = {'a':'np.float64', 'b':'object', 'c':'Int64'}) |
参数 parse_dates:
parse_dates 参数用来转换数据为日期类型。有四种情况:
- 布尔值。如果为True - >尝试解析索引。
- int或名称列表。例如,[0,1,2] - >尝试将 第 1,2,3 列解析为一个单独的日期列。
- 列表清单。例如,[[1,3]] - >将第 1 列和第 3 列组合在一起并解析为单个日期列。
- 字典,例如{‘foo’:[1,3]} - >将第 1 , 3 列解析为日期并调用结果’foo’
如果列或索引不能表示为日期时间数组,例如由于不可解析的值或时区的混合,则列或索引将作为对象数据类型不加改变地返回。对于非标准日期时间解析,可以先使用 pd.to_datetime 转换,再使用 pd.read_csv。为了解析与时区的混合索引或列,可以指定 pandas.to_datetime() 的 utc=True。(时区说明)
参数 date_parser:
用于将字符串列序列转换为日期时间实例数组的函数。默认使用 dateutil.parser.parser 执行转换。pandas将尝试以三种不同的方式调用date_parser,如果发生异常则前进到下一个。
参数 encoding:
指定读取时的编码。不同文件的编码可能不同,所以需要根据实际情况来指定编码,防止数据读取出现乱码。可以参考这里:Python 标准编码列表
总结:
chunksize 和 iterator 还是下一篇文章再说吧,这里有点多了(时间也不早了)。通过总结这个每天都会用无数次的函数,我也掌握了一些之前并不了解的参数知识。所以说善于总结问题也是进步的途径,下一篇见~~