前言
Pandas常用作数据分析工具库以及利用其自带的DataFrame数据类型做一些灵活的数据转换、计算、运算等复杂操作,但都是建立在我们获取数据源的数据之后。因此作为读取数据源信息的接口函数必然拥有其强大且方便的能力,在读取不同类源或是不同类数据时都有其对应的read函数可进行先一步处理,这会减少我们相当大的一部分数据处理操作。每一个read()函数,作为一名数据分析师我个人认为都应该掌握且熟悉它对应的参数,相对应的read()函数博主已有三篇文章详细解读了read_json、read_excel和read_sql:
Pandas获取SQL数据库read_sql()函数及参数一文详解+实例代码
Pandas处理JSON文件read_json()一文详解+代码展示
Pandas中read_excel函数参数使用详解+实例代码
纵观整个数据源路径来看,最常用的数据存储对象:SQL、JSON、EXCEL以及这次要详解的CSV都遍及全了。 如果能够懂得该函数参数的使用可以减少大量后续处理DataFrame数据结构的代码,仅需要设置几个read_csv参数就可实现,因此本篇文章初衷为详细介绍并运用此函数来达到彻底掌握的目的。希望读者看完能够提出问题或者看法,博主会长期维护博客做及时更新,希望大家喜欢。
这里拿脱敏后的user_info.csv文件作为展示:
一、基础语法与功能
read_csv基础语法格式为:
pandas.read_csv(filepath_or_buffer, sep=NoDefault.no_default, delimiter=None, header='infer', names=NoDefault.no_default, index_col=None, usecols=None, squeeze=None, prefix=NoDefault.no_default, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=None, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal='.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, encoding_errors='strict', dialect=None, error_bad_lines=None, warn_bad_lines=None, on_bad_lines=None, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options=None)
可以看到参数是相当多的,比起read_excel、read_json和read_sql加起来还要多。说明了使用csv文件存储数据的频率是其他记录数据文件的几倍之高,因此关于csv文件的处理参数也会有如此之多。这是好事,等到我们将csv文件转换为了DataFrame数据再处理时,就需要写很多代码去处理,提供了这么多参数可以大大加快我们处理文件的效率。
read_csv的基本功能就是将csv文件转化为DataFrame或者是TextParser,还支持可选地将文件迭代或分解为块。
import numpy as np import pandas as pd df_csv=pd.read_csv('user_info.csv')
二、参数说明和代码演示
以下为官方文档,文字实在是太多了推荐直接点目录看:
首先我们将逐个了解每个参数的功能和作用,在了解参数意义后再进行实例使用。
1.filepath_or_buffer
接受类型:{str, path object or file-like object}字符串(一般为文件名且在当前运行程序的目录下才能读取到)、文件路径(一般推荐为绝对路径)、或者为其他可引用的数据类型。如url,http这种类型。
此参数为指定读入文件的路径。可以接受任何有效的字符串路径。字符串可以是URL。有效的URL包括http、ftp、s3、gs和文件。对于文件URL,本地文件可以是:file://localhost/path/to/table.csv.
如果要传入路径对象,pandas接受任何路径。
对于类文件对象,我们使用read()方法引用对象,例如文件句柄(例如通过内置的open函数)或StringIO。
df_csv=pd.read_csv('user_info.csv') df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv') df_csv=pd.read_csv('C:\\Users\\10799\\test-python\\user_info.csv')
2.sep
接受类型{str, default ‘,’}
csv文件一般默认是用','来分隔每个字符串的,而sep就是指定分隔的符号是什么类型。
如果sep为None,则C引擎无法自动检测分隔符,但Python解析引擎可以,这意味着Python的内置嗅探器工具csv将使用后者并自动检测分隔符。此外,长度超过1个字符且与“\s+”不同的分隔符将被解释为正则表达式,并将强制使用Python解析引擎。请注意regex分隔符容易忽略引用的数据。regex正则表达式示例:“\r\t”。
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',sep=',') df_csv
对于sep字符可以参照转义字符:
转义字符 描述
\(在行尾时) 续行符
\\ 反斜杠符号
\‘ 单引号
\” 双引号
\a 响铃
\b 退格(Backspace)
\e 转义
\000 空
\n 换行
\v 纵向制表符
\t 横向制表符
\r 回车
\f 换页
\oyy 八进制数yy代表的字符,例如:\o12代表换行
\xyy 十进制数yy代表的字符,例如:\x0a代表换行
\other 其它的字符以普通格式输出
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',sep='/t')
这样不再重复实验,有兴趣的大家可以自行尝试。
3.delimiter
接受类型:{str, default None
}
sep的别名,可以设置为想要名字,没有什么很大的意义。
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',delimiter=',') df_csv
4.header
接受类型:{int, list of int, None, default ‘infer’}整数、整数列表、None。默认为infer
指定要用作列名的行号,以及数据的开头。默认行为是推断列名:如果未传递任何名称,则行为与header=0相同,并且从文件的第一行推断列名,如果显式传递列名,则行为与header=None相同。显式传递header=0,以便能够替换现有名称。标题可以是整数列表,指定列上多索引的行位置,例如[0,1,3]。将跳过未指定的中间行(例如,跳过本例中的2)。请注意,如果skip_blank_lines=True,此参数将忽略注释行和空行,因此header=0表示数据的第一行,而不是文件的第一行。
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',header=1)
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',header=[0,1,3])
5.names
接受类型:{array-like, optional}
指定要使用的列名列表。如果文件包含标题行,则应显式传递header=0以覆盖列名。此列表中不允许重复。
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv', header=0,names=['id','time','name1','name2','name3','name4','name5','name6'])
6.index_col
接受类型:{int, str, sequence of int / str, or False, optional}默认为None。
指定要用作DataFrame行标签的列,以字符串名称或列索引的形式给出。如果给定int/str序列,则使用多索引。
注意:index_col=False可用于强制pandas不使用第一列作为索引,例如,当您有一个格式错误的文件,每行末尾都有分隔符时。
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',index_col='user_id')
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',index_col=0)
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',index_col=[1,'user_id'])
当index_col为False时,将不指定索引列。
7.usecols
接受类型:{list-like or callable, optional}
返回列的子集。如果为列表形式,则所有元素必须是位置元素(即文档列中的整数索引)或与用户在名称中提供的列名或从文档标题行推断的列名相对应的字符串。如果给定了names参数,则不考虑文档标题行。例如,像usecols参数这样的有效列表应该是[0、1、2]或['foo',bar',baz']。
指定的列表顺序是不给予考虑的,与原csv文件的列原始顺序一样,因此usecols=[0,1]与[1,0]相同。如果可调用,将根据列名计算可调用函数,返回可调用函数计算为True的名称。有效的可调用参数的一个示例是['AAA','BBB','DDD'中的lambda x:x.upper()。使用此参数可以加快解析时间并降低内存使用率。
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',usecols=['age_month'])
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',usecols=[0,2])
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv', header=0, names=['id','time','name1','name2','name3','name4','name5','name6'], usecols=['id','name1'])
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv', usecols=['age_month','first_order_time'])
可见给定的列表但生成的DataFrame的顺序是不会根据给的列表顺序改变的。
8.squeeze
接受类型:{bool, default False}
如果解析的数据只包含一列,则返回一个序列。
df_csv=pd.read_csv('user_info.csv',usecols=['age_month'],squeeze=True)
9.prefix
接受类型:{str, optional}
无标题时添加到列号的前缀,例如“X”表示X0,X1。
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',header=None,prefix='name')
10.mangle_dupe_cols
接受类型:{bool, default True}
重复列将指定为“X”、“X.1”、“X.N”,而不是“X”…“X”。如果列中有重复的名称,传入False将导致数据被覆盖。
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',header=0,names=['id','time','name1','name2','name3','name4','name5','name6'],mangle_dupe_cols=False)
ValueError: Setting mangle_dupe_cols=False is not supported yet
设置为False时现在还不支持。
11.dtype
接受类型:{Type name or dict of column -> type, optional}
指定数据或列的数据类型。例如:{‘a’: np.float64, ‘b’: np.int32, ‘c’: ‘Int64’} 。
将str或object与适当的na_values设置一起使用,以保留而不是解释数据类型。如果指定了转换器,则将应用INSTEAD而不是数据类型转换。
df_csv=pd.read_csv('user_info.csv') df_csv.dtypes
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',dtype={'user_id':'str'}) df_csv.dtypes
12.engine
接受类型:{‘c’, ‘python’, ‘pyarrow’}
指定要使用的解析器引擎。C和pyarrow引擎的速度更快,而python引擎目前的功能更加完整。多线程目前仅由pyarrow引擎支持。
time_start=time.time() df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',engine='python') time_end=time.time() print('time cost',time_end-time_start,'s')
time cost 1.0299623012542725 s
time_start=time.time() df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',engine='c') time_end=time.time() print('time cost',time_end-time_start,'s')
time cost 0.20297026634216309 s
13.converters
接受类型:{dict, optional}
用于转换某些列中的值的函数的功能。键可以是整数或列标签。
df_csv=pd.read_csv(r'C:\Users\10799\test-python\user_info.csv',converters={'city_num':lambda x:x})
14.true_values
接受类型:{list, optional}
指定列表要视为真,当读出的csv太多时该参数会有BUG,读不出来:
df_csv=pd.read_csv('user_info.csv',true_values=['广州'])
这个广州没变,我也试了试很多值也没用,估计内部参数逻辑不适用大含量的csv数据。
跑个简单的就行:
from io import StringIO data = ('a,b,c\n1,Yes,2\n3,No,4') pd.read_csv(StringIO(data), true_values=['Yes'], false_values=['No'])
不推荐大家使用该参数来调TRUE,自己写个lambda函数或者replace是一样的,这个作用于全局会出问题。只有当某一列的数据全部出现在true_values + false_values里面,才会被替换。