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

学习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 符号

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

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.

登录免费注册