你真的会用 read_csv() 吗?

在使用 Python 进行数据分析时,读取数据是第一步。与众多数据分析师交流以及结合自己数据分析经历发现:pd.read_csv() 是使用频率最高的方法,这得益于CSV文件简单、轻量以及跨平台兼容的特性。本文将全面地介绍 pd.read_csv(),无论是数据分析小白还是大牛,阅读本文后都能有所收获。

正式开始!!!

pd.read_csv() 参数众多,功能强大。

1. 数据内容 filepath_or_buffer

filepath_or_buffer 是第一个重要参数,没有默认值,同时不能为空。该参数指向你所要读取的数据。支持本地CSV文件路径(相对路径和绝对路径)和文件URL。使用中需要注意不同操作系统的文件路径写法:在 Windows 系统中,推荐使用类似于 "D:\\documents\\data.csv" 的形式传递参数;在Mac操作系统中,文件路径的形式为:"/Users/username/Desktop/file.csv"。

2. 分隔符 sep

sep参数是接受一个字符型参数,代表每行数据内容的分隔符号,默认参数是逗号。常见的还有制表符(\t)、空格等。其中逗号是使用最多的分隔符号,一般情况下不需要修改。如果遇到分隔符号不为逗号的数据,可以用记事本查看数据,将分隔符号传递个sep参数。

 
pd.read_csv('data.csv', sep='\t')  # 制表符分隔tab
pd.read_csv('data.csv')  # 默认是逗号分隔
pd.read_csv('data.csv', sep='|')  # | 符分隔
pd.read_csv('data.csv',sep="(?<!a)\|(?!1)", engine='python') # 正则表达式

3. 表头 header

header 参数接受整型和由整型组成的列表,用于指定第几行或哪几行作为表头,默认情况下把第一行作为表头。

pd.read_csv('data.csv', header=0) # 第一行
pd.read_csv('data.csv', header=None) # 没有表头
pd.read_csv('data.csv', header=[0,1,3]) # 第一、二、三行作为多级表头(多层索引)

4. 列名 names

names 用来指定列的名称,接受一个类似列表的序列,与数据一一对应。在使用该参数时,默认CSV文件中的数据不含表头。如果目标CSV文件中包含表头且 names 参数不为 None,返回结果将把表头视为数据。

因此,names 只在读取不含表头的数据时使用,且应该同时设置 header = None,列名列表中不允许出现重复值。(如果传递的类似列表的序列与数据不是一一对应关系,如:数据共有5列,但 names 接收的列表元素个数为4个,此时数据中的第一列将默认成为索引。)

pd.read_csv('data.csv', names=['col1', 'col2']) # 指定列名列表
pd.read_csv('data.csv', names=['col1', 'col2'], header=None)
# 如果 data.csv 包含四列,第一、二列将被设为多层索引。

5. 索引 index_col

index_col 是用于指定索引列的参数,可以接受行索引的列编号或者列名作为输入。如果指定了一个序列,那么会有多个行索引。需要注意的是,Pandas不会自动将第一列作为索引,除非显式地使用index_col参数来指定,即没有指定 index_col 参数时,Pandas会默认使用以0开始的自然索引。

# 支持int、str、int序列、str序列

pd.read_csv('data.csv', index_col=0) # 第一列作为索引
pd.read_csv('data.csv', index_col='date') # 指定 date 列作为索引
pd.read_csv('data.csv', index_col=['year','month']) # 多层索引
pd.read_csv('data.csv', index_col=[0, 2]) # 按列索引指定多层索引

6. 使用部分列 usecols

usecols 接受一个类似列表的序列。使用 usecols 参数可以仅加载数据的部分列,这样可以根据实际分析需要使用数据,提高数据加载速度并降低内存消耗。需要注意的是,使用usecols参数需要显式地指定要加载的列,以便Pandas能够正确地读取数据。

 
# 读取部分列,支持int、str、int序列、str序列
pd.read_csv('data.csv', usecols=[0,6,3]) # 按索引只读取指定列,与顺序无关
# 指定列顺序,其实是DataFrame的筛选功能
pd.read_csv('data.csv', usecols=['col1', 'col2'])[['col2', 'col1']]
pd.read_csv('data.csv', usecols=['col1', 'col5']) # 按列名读取,要求列名必须存在

7. 数据类型 dtype

dtype 参数用于指定每列的数据类型。它通常接受一个字典作为输入,其中字典的键是列名,值是相应列的数据类型。也可以使用一个单一的数据类型来应用于所有列。使用dtype参数可以确保读取的数据以指定的数据类型加载,有助于提高数据的准确性和内存使用效率。

# 传入数据类型,或者以列名为键、以指定类型为值的字典
pd.read_csv('data.csv', dtype=np.float64) # 所有数据均使用此类型
pd.read_csv('data.csv', dtype={'col1':np.float64, 'col2': str}) # 指定特定字段的类型
pd.read_csv('data.csv', dtype=[datetime, datetime, str, float]) # 一一对应,依次指定

8. 列数据处理 converters

converters 参数可以用来指定对特定列进行数据转换的函数。它接受一个字典作为参数,其中键是要转换的列名,值是相应的转换函数。使用converters可以从一开始就对数据进行一定的处理,提高后续数据分析的效率和体验。

def convert_to_float(value):
    # 将字符串转换为浮点数
    return float(value)

# 将 col1 返回为浮点数
df = pd.read_csv("data.csv", converters={'col1': convert_to_float})
# 将索引为 1 的列返回为浮点数
df = pd.read_csv("data.csv", converters={1: convert_to_float})
df = pd.read_csv("data.csv", converters={'col1': lambda x: x*3})

9. 布尔值转换 true_values, false_values

使用true_valuesfalse_values将指定的文本内容转换为布尔值 True 或 False,接受一个类似列表的序列,默认为None。

# 列表,默认为None
# 读取CSV文件,并在读取时使用true_values和false_values参数
df = pd.read_csv('data.csv', true_values=['yes', '1'], false_values=['no', '0'])

10. 跳过行 skiprows, skipfooter, skip_blank_lines

在使用 pd.read_csv() 函数读取CSV文件时,你可以使用skiprows 和 skipfooter 参数来跳过一些开头的行或尾部的行。 如下跳过需要忽略的行数(从文件开始处算起)或需要忽略的行号列表(从0开始):

# 类似列表的序列或者可调用对象
# 跳过前三行
pd.read_csv('data.csv', skiprows=2)
# 跳过前三行
pd.read_csv('data.csv', skiprows=range(2))
# 跳过指定索引行
pd.read_csv('data.csv', skiprows=[24,234,141])
# 跳过偶数行(隔行跳过)
pd.read_csv('data.csv', skiprows=lambda x: x % 2 != 0)

# int类型, 默认为0,不跳过
pd.read_csv('data.csv', skipfooter=1) # 最后一行不加载

# skip_blank_lines指定是否跳过空行,布尔型,默认为True,跳过空行
# False时不跳过空行,数据记为NaN。
pd.read_csv('data.csv', skip_blank_lines=False)

值得注意的一点是:skip_blank_lines=True时,header 参数将忽略空行和注释行,因此header=0表示第一行数据而非文件的第一行。当数据第一行为空时,需要注意这个问题。

11. 读取前N行 nrows

nrows 参数接受一个整数,可以用来指定要读取的行数。这样可以在处理大型数据集时,只读取部分数据进行操作,节省内存和计算资源。 需要注意的是,nrows 参数只控制读取的行数,不会影响列数。如果CSV文件中有多余的列,Pandas仍然会将它们读取到DataFrame中。需要时可以结合 usecols一起使用。

# 读取CSV文件的前50行
df = pd.read_csv('data.csv', nrows=50)

12. 是否识别空值 na_filter

na_filter参数控制是否识别空值,接受一个布尔值。默认为True。如果为False,那么keep_default_na 和na_values参数均失效。实际的使用中一般默认为True,对于没有空值大文件来说,设定na_filter=False 可以提升读取速度。
# 布尔型,默认为True
pd.read_csv('data.csv', na_filter=False) # 不检查

13. 替换空值 na_values

na_values 参数可以用来指定要将哪些特定的值识别为缺失值(NaN),该参数可以接受不同类型的值,例如单个字符串、数值、类似列表的序列、字典等。这使得你可以根据具体的需求来指定要识别为缺失值的特定值。使用时还需要注意  keep_default_na 参数的影响。
keep_default_na和na_values的缺失值取值逻辑
keep_default_nana_values缺失值取值逻辑
True赋值默认缺失值和指定缺失值
True不赋值默认缺失值

False

赋值na_values指定缺失值
False不赋值不识别缺失值
# 默认为None,可传入标量、字符串、类似列表序列和字典
# 9和9.0会被认为是NaN
pd.read_csv('data.csv', na_values=[9])
# ?会被认为是NaN
pd.read_csv('data.csv', na_values='?')
# 字符NA和字符0会被认为是NaN
pd.read_csv('data.csv', keep_default_na=False, na_values=["NA", "0"])
# a、b、c均被认为是NaN,等于na_values=['a','b','c']
pd.read_csv('data.csv', na_values='abc')
# 指定列的指定值会被认为是NaN
pd.read_csv('data.csv', na_values={'col1':'0', 3:[0,5]})

14. 是否保留默认空值 keep_default_na

keep_default_na 参数可以用来控制是否保留默认的缺失值识别行为。 默认情况下,Pandas会将一些常见的字符串(如'NA'、'NaN'、'null'等)识别为缺失值(NaN)。但是,通过设置keep_default_na 参数,你可以控制是否保留这种默认的缺失值识别行为。 如果指定 na_values参数,并且 keep_default_na=False ,那么默认的 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', '']

15. 解析日期时间 parse_dates

parse_dates 参数j接受一个以列名为元素的列表,可以用来指定要解析为日期时间类型的列。如果CSV文件中有多个列需要解析为日期时间类型,可以将这些列名都放入parse_dates参数的列表中。 需要注意的是,默认情况下,Pandas会尝试自动解析所有的列为日期时间类型。如果你只想解析特定的列,可以使用 parse_dates 参数来指定这些列。

parse_dates 是一个复杂的操作,但 Pandas 让一切变得简单,这里不做更深的探讨,有兴趣的家人可以自行研究。

# 读取CSV文件,并解析'date'列为日期时间类型
df = pd.read_csv('data.csv', parse_dates=['date'])

16. 文件编码 encoding

参考之前的一篇文章:read_csv()参数之encoding——看这篇就够了

17. 转Series序列 squeeze

squeeze 参数用于控制返回的数据结构是否进行降维操作。当squeeze参数设置为True时,如果数据只有一个维度,则返回一个Series对象,而不是默认的DataFrame对象,这在一定程度上可以简化后续的数据处理操作。如果数据有多个维度,则返回的仍然是DataFrame对象。当squeeze参数设置为False时,无论数据是单维度还是多维度,都将返回DataFrame对象。

# 布尔型,默认为False
# 只取一列或data.csv只有一列,则返回一个Series
pd.read_csv('data.csv', usecols=[0], squeeze=True)
# 取两列或data.csv包含二列,则还是返回 DataFrame
pd.read_csv('data.csv', usecols=[0, 2], squeeze=True)

18. 表头前缀 prefix

prefix参数用于指定列名的前缀,使用时需要显式指定。它可以接受一个字符串作为输入,该字符串将被添加到每个列名的前面。 如果数据没有列名,可以指定一个前缀加序数的名称,通过prefix参数指定前缀,可以返回一系列前缀加序数的名称。

# 表头为col0,col1,col2…… 
pd.read_csv('data.csv', prefix='col', header=None)

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值