Python_tips-read_csv

万壑松风知客来,摇扇抚琴待留声

简述:

前一篇文章简单描述了 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
2
3
pd.read_csv(filepath, sep=',')
pd.read_csv(filepath, sep='\t')
pd.read_csv(filepath, sep='|')
参数 header:

用来指定读取文件的头信息(列名),默认 infer 为推断列名,推断从文件的第一行号下数据不为空开始。若该行值不为空,则作为数据的列名。若读取的文件只保留了数据没有列名,则可以指定 header=None ,自动生成新列名;若文件中有列名,则可以传参指定,传入的参数为 int 行号,如:

1
2
3
4
pd.read_csv(filepath, header='infer')	# 次序推断
pd.read_csv(filepath, header=None) # 生成新列名
pd.read_csv(filepath, header=0) # 第 1 行号数据作为列名
pd.read_csv(filepath, header=1) # 第 2 行号数据作为列名
参数 names:

header 参数类似用来确定列名,对于某些读取的文件没有列名,但我们希望能主观指定列名,那么就可以使用该参数。通过传入一个列表,其中列表包含列维度上等长值,以便给每列一个指定值。官方表示,如果使用该参数就意味着 header=None,最好明确传入:

1
2
# 此时读取文件有 4 列数据
pd.read_csv(filepath, header=None, names=['dog','cat','pig','monkey'])
参数 index_col:

在使用默认 read_csv 读取文件时,会给读取的文件新生成一个行索引,从 0 开始的数字标签。但很多时候数据的行索引已经包含在内,并不需要新生成,所以这时候可以通过该参数指定使用哪一列作为行索引,参数为 int 型:

1
2
3
pd.read_csv(filepath, index_col=False)	# 新生成 0 开始的行索引
pd.read_csv(filepath, index_col=0) # 使用第 1 列作为行索引
pd.read_csv(filepath, index_col=1) # 使用第 2 列作为行索引
参数 prefix:

首字,添加在列名前,但需要配合 header 参数使用。当使用 header=None 同时指定 prefix 参数,那么就会为新生成的列名加前缀:

1
2
3
4
5
6
7
# 添加前缀 X
df = pd.read_csv(filepath, header=None, prefix='X')
print(df.columns)

Index(['X0', 'X1', 'X2', 'X3', 'X4', 'X5', 'X6', 'X7', 'X8', 'X9', 'X10',
'X11', 'X12', 'X13', 'X14', 'X15', 'X16', 'X17', 'X18', 'X19', 'X20'],
dtype='object')
参数 dtype:

读取文件时,可以通过dtype参数来指定数据的类型。数据或列的数据类型。当数据有多列时,其中 a、b、c 三列我们需要重新指定类型,可以使用字典方法处理,如:dtype = {'a':'np.float64', 'b':'object', 'c':'Int64'} 。如果需要统一指定所有列类型,可以直接 dtype = 'object'

1
2
pd.read_csv(filepath, dtype = {'a':'np.float64', 'b':'object', 'c':'Int64'})
pd.read_csv(filepath, dtype='object')
参数 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 标准编码列表

总结:

chunksizeiterator 还是下一篇文章再说吧,这里有点多了(时间也不早了)。通过总结这个每天都会用无数次的函数,我也掌握了一些之前并不了解的参数知识。所以说善于总结问题也是进步的途径,下一篇见~~