在使用 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_values和false_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
# 布尔型,默认为True
pd.read_csv('data.csv', na_filter=False) # 不检查
13. 替换空值 na_values
keep_default_na | na_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
['-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)