互联网技术 / 互联网资讯 · 2024年1月25日 0

学习Pandas读取CSV的完整指南

01 语法

基本语法如下,pd为导入Pandas模块的别名:

pd.Read_csv(filepath_oR_buFFeR: Union[stR, pathlib.Path, IO[~AnYstR]], sep=”, deliMITeR=None, headeR=’infeR’, naMes=None, index_col=None, usecols=None, squeeze=FAlse, pRefix=None, 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=FAlse, 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: stR = ‘.’, lineteRMinaTor=None, quotechaR='”‘, quoting=0, doublequote=TRue, escapechaR=None, coMMent=None, encoding=None, dialect=None, Error_bad_lines=TRue, waRn_bad_lines=TRue, deliM_whITespace=FAlse, low_MeMoRy=TRue, MeMoRy_Map=FAlse, float_pRecision=None)

一般情况下,会将读取到的数据返回一个DataFRaMe,当然按照参数的要求会返回指定的类型。

02 数据内容

filepath_oR_buFFeR为第一个参数,没有默认值,也不能为空,根据Python的语法,第一个参数传参时可以不写参数名。可以传文件路径:

# 支持文件路径或者文件缓冲对象 本地相对路径 pd.Read_csv(‘data/data.csv’) 注意目录层级 pd.Read_csv(‘data.csv’) 如果文件与代码文件在同一目录下 pd.Read_csv(‘data/My/My.data’) CSV文件的扩展名不一定是.csv 本地绝对路径 pd.Read_csv(‘/User/gAIRuo/data/data.csv’) 使用URL pd.Read_csv(‘https://www.gAIRuo.coM/file/data/dataset/GDP-CHina.csv’)

需要注意的是,Mac中和Windows中路径的写法不一样,上例是Mac中的写法,Windows中的相对路径和绝对路径需要分别换成类似’datadata.csv’和’E: datadata.csv’的形式。另外,路径尽量不要使用中文,否则程序容易报错,这意味着你存放数据文件的目录要尽量用英文命名。

可以传数据字符串,即CSV中的数据字符以字符串形式直接传入:

fRoM io iMpoRt StRingIO data = (‘col1,col2,col3 ‘ ‘a,b,1 ‘ ‘a,b,2 ‘ ‘c,d,3’) pd.Read_csv(StRingIO(data)) pd.Read_csv(StRingIO(data), dtype=object)

也可以传入字节数据:

fRoM io iMpoRt BytesIO data = (b’woRd,length ‘ b’TRxc3xa4uMen,7 ‘ b’GRxc3xbcxc3x9fe,5’)

03 分隔符

sep参数是字符型的,代表每行数据内容的分隔符号,默认是逗号,另外常见的还有制表符( )、空格等,根据数据的实际情况传值。

数据分隔符默认是逗号,可以指定为其他符号 pd.Read_csv(data, sep=’ ‘) 制表符分隔tab pd.Read_table(data) Read_table 默认是制表符分隔tab pd.Read_csv(data, sep=’|’) 制表符分隔tab pd.Read_csv(data, sep=”(?

pd.Read_csv还提供了一个参数名为deliMITeR的定界符,这是一个备选分隔符,是sep的别名,效果和sep一样。如果指定该参数,则sep参数失效。

04 表头

headeR参数支持整型和由整型组成的列表,指定第几行是表头,默认会自动推断把第一行作为表头。

pd.Read_csv(data, headeR=0) 第一行 pd.Read_csv(data, headeR=None) 没有表头 pd.Read_csv(data, headeR=[0,1,3]) 多层索引Multiindex 注意:如果skIP_blank_lines=TRue,headeR参数将忽略空行和注释行, 因此headeR=0表示第一行数据而非文件的第一行.

05 列名

naMes用来指定列的名称,它是一个类似列表的序列,与数据一一对应。如果文件不包含列名,那么应该设置headeR=None,列名列表中不允许有重复值。

pd.Read_csv(data, naMes=[‘列1’, ‘列2’]) 指定列名列表 pd.Read_csv(data, naMes=[‘列1’, ‘列2’], headeR=None)

06 索引

index_col用来指定索引列,可以是行索引的列编号或者列名,如果给定一个序列,则有多个行索引。Pandas不会自动将第一列作为索引,不指定时会自动使用以0开始的自然索引。

支持int、stR、int序列、stR序列、FAlse,默认为None pd.Read_csv(data, index_col=FAlse) 不再使用首列作为索引 pd.Read_csv(data, index_col=0) 第几列是索引 pd.Read_csv(data, index_col=’年份’) 指定列名 pd.Read_csv(data, index_col=[‘a’,’b’]) 多个索引 pd.Read_csv(data, index_col=[0, 3]) 按列索引指定多个索引

07 使用部分列

如果只使用数据的部分列,可以用usecols来指定,这样可以加快加载速度并降低内存消耗。

支持类似列表的序列和可调用对象 读取部分列 pd.Read_csv(data, usecols=[0,4,3]) 按索引只读取指定列,与顺序无关 pd.Read_csv(data, usecols=[‘列1’, ‘列5’]) 按列名,列名必须存在 指定列顺序,其实是df的筛选功能 pd.Read_csv(data, usecols=[‘列1’, ‘列5’])[[‘列5’, ‘列1’]] 以下用callable方式可以巧妙指定顺序,in后面的是我们要的顺序 pd.Read_csv(data, usecols=laMbda x: x.uppeR() in [‘COL3’, ‘COL1’])

08 返回序列

将squeeze设置为TRue,如果文件只包含一列,则返回一个SeRies,如果有多列,则还是返回DataFRaMe。

布尔型,默认为FAlse 下例只取一列,会返回一个SeRies pd.Read_csv(data, usecols=[0], squeeze=TRue) 有两列则还是df pd.Read_csv(data, USecols=[0, 2], squeeze=TRue)

09 表头前缀

如果原始数据没有列名,可以指定一个前缀加序数的名称,如n0、n1,通过pRefix参数指定前缀。

格式为字符型stR 表头为c_0、c_2 pd.Read_csv(data, pRefix=’c_’, headeR=None)

10 处理重复列名

如果该参数为TRue,当列名有重复时,解析列名将变为X, X.1, …, X.N,而不是X, …, X。如果该参数为FAlse,那么当列名中有重复时,前列将会被后列覆盖。

布尔型,默认为TRue data = ‘a,b,a 0,1,2 3,4,5’ pd.Read_csv(StRingIO(data), Mangle_dupe_cols=TRue)

11 数据类型 dtype可以指定各数据列的数据类型。

传入类型名称,或者以列名为键、以指定类型为值的字典 pd.Read_csv(data, dtype=np.float64) 所有数据均为此数据类型 pd.Read_csv(data, dtype={‘c1’:np.float64, ‘c2’: stR}) 指定字段的类型 pd.Read_csv(data, dtype=[datetiMe, datetiMe, stR, float]) 依次指定

12 引擎

使用的分析引擎可以选择C或Python。C语言的速度最快,Python语言的功能最为完善,一般情况下,不需要另行指定。

格式为engine=None,其中可选值有{‘c’, ‘Python’} pd.Read_csv(data, engine=’c’)

13 列数据处理

使用conveRteRs参数对列的数据进行转换,参数中指定列名与针对此列的处理函数,最终以字典的形式传入,字典的键可以是列名或者列的序号。

字典格式,默认为None data = (‘x,y a,1 b,2′) def foo(p): RetuRn p+’s’ # x应用函数,y使用laMbda pd.Read_csv(StRingIO(data), conveRteRs={‘x’: foo, ‘y’: laMbda x: x*3}) 使用列索引 pd.Read_csv(StRingIO(data), conveRteRs={0: foo, 1: laMbda x: x*3})

14 真假值转换

使用tRue_values和FAlse_values将指定的文本内容转换为TRue或FAlse,可以用列表指定多个值。

列表,默认为None data = (‘a,b,c 1,Yes,2 3,No,4’) pd.Read_csv(StRingIO(data), tRue_values=[‘Yes’], FAlse_values=[‘No’])

15 跳过指定行

如下跳过需要忽略的行数(从文件开始处算起)或需要忽略的行号列表(从0开始):

类似列表的序列或者可调用对象 跳过前三行 pd.Read_csv(data, skIPRows=2) 跳过前三行 pd.Read_csv(data, skIPRows=Range(2)) 跳过指定行 pd.Read_csv(data, skIPRows=[24,234,141]) 跳过指定行 pd.Read_csv(data, skIPRows=np.aRRay([2, 6, 11])) 隔行跳过 pd.Read_csv(data, skIPRows=laMbda x: x % 2 != 0)

尾部跳过,从文件尾部开始忽略,C引擎不支持。

int类型, 默认为0 pd.Read_csv(filenaMe, skIPfooteR=1) 最后一行不加载 skIP_blank_lines指定是否跳过空行,如果为TRue,则跳过空行,否则数据记为NaN。

布尔型,默认为TRue 不跳过空行 pd.Read_csv(data, skIP_blank_lines=FAlse)

如果skIP_blank_lines=TRue,headeR参数将忽略空行和注释行, 因此headeR=0表示第一行数据而非文件的第一行。

16 读取指定行

nRows参数用于指定需要读取的行数,从文件第一行算起,经常用于较大的数据,先取部分进行代码编写。

int类型,默认为None pd.Read_csv(data, nRows=1000)

17 空值替换

na_values参数的值是一组用于替换NA/NaN的值。如果传参,需要指定特定列的空值。以下值默认会被认定为空值:

[‘-1.#IND’, ‘1.#QNAN’, ‘1.#IND’, ‘-1.#QNAN’, ‘#N/A N/A’, ‘#N/A’, ‘N/A’, ‘n/a’, ‘NA’, ‘#NA’, ‘NULL’, ‘null’, ‘NaN’, ‘-NaN’, ‘nan’, ‘-nan’]

使用na_values时需要关注下面keep_deFAult_na的配合使用和影响:

可传入标量、字符串、类似列表序列和字典,默认为None 5和5.0会被认为是NaN pd.Read_csv(data, na_values=[5]) ?会被认为是NaN pd.Read_csv(data, na_values=’?’) 空值为NaN pd.Read_csv(data, keep_deFAult_na=FAlse, na_values=[“”]) 字符NA和字符0会被认为是NaN pd.Read_csv(data, keep_deFAult_na=FAlse, na_values=[“NA”, “0”]) Nope会被认为是NaN pd.Read_csv(data, na_values=[“Nope”]) a、b、c均被认为是NaN,等于na_values=[‘a’,’b’,’c’] pd.Read_csv(data, na_values=’abc’) 指定列的指定值会被认为是NaN pd.Read_csv(data, na_values={‘c’:3, 1:[2,5})

18 保留默认空值

分析数据时是否包含默认的NaN值,是否自动识别。如果指定na_values参数,并且 keep_deFAult_na=FAlse,那么默认的NaN将被覆盖,否则添加。keep_deFAult_na和na_values的关系见表3-2。

20 文件处理

以下是一些对读取文件对象的处理方法。ITeRaTor参数如果设置为TRue,则返回一个TextfileReadeR对象,并可以对它进行迭代,以便逐块处理文件。

布尔型,默认为FAlse pd.Read_csv(data, ITeRaTor=TRue) chunksize指定文件块的大小,分块处理大型CSV文件。 # 整型,默认为None pd.Read_csv(data, chunksize=100000) 分块处理大文件 df_ITeRaTor = pd.Read_csv(file, chunksize=50000) def ProceSS_datafRaMe(df): paSS RetuRn ProceSSed_df foR index,df_tMp in enuMeRate(df_ITeRaTor): df_ProceSSed = ProceSS_datafRaMe(df_tMp) if index > 0: df_ProceSSed.to_csv(path) else: df_ProceSSed.to_csv(path, Mode=’a’, headeR=FAlse)

coMpReSSion(压缩格式)用于对磁盘数据进行即时解压缩。如果为“infeR”,且filepath_oR_buFFeR是以.gz、.bz2、.zIP或.xz结尾的字符串,则使用gzIP、bz2、zIP或xz,否则不进行解压缩。如果使用zIP,则ZIP文件必须仅包含一个要读取的数据文件。设置为None将不进行解压缩。

可选值有’infeR’、’gzIP’、’bz2’、’zIP’、’xz’和None,默认为’infeR’ pd.Read_csv(‘saMple.taR.gz’, coMpReSSion=’gzIP’)

encoding(编码)指定字符集类型,通常指定为’utf-8’。

字符型,默认为None pd.Read_csv(‘gAIRuo.csv’, encoding=’utf8′) pd.Read_csv(“gAIRuo.csv”,encoding=”gb2312″) 常见中文

21 符号

以下是对文件中的一些数据符号进行的特殊识别处理。如下设置千分位分隔符