Pandas pd.ead_csv() 函数
read_csv() 是 pandas 库中最常用的数据读取函数,用于从 CSV(逗号分隔值)文件中读取数据并创建 DataFrame。
CSV 文件是一种简单且广泛使用的数据交换格式,它以纯文本形式存储表格数据,每行代表一条记录,字段之间用逗号分隔。read_csv() 能够智能解析 CSV 文件,自动识别列名、数据类型,并处理各种分隔符和编码问题。
基本语法与参数
语法格式
pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',
names=None, index_col=None, usecols=None, dtype=None,
skiprows=None, nrows=None, na_values=None, ...)
参数说明
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| filepath_or_buffer | str, path object, 或 file-like object | CSV 文件的路径、URL 或文件对象 | 必填 |
| sep | str | 字段分隔符,CSV 默认是逗号 | ',' |
| header | int, list of int, 'infer' | 用作列名的行号,0 表示第一行 | 'infer' |
| names | list-like | 自定义列名列表 | None |
| index_col | int, str, list of int, list of str, False | 用作行索引的列 | None |
| usecols | list-like, callable | 只读取指定的列 | None |
| dtype | dict | 指定列的数据类型,如 {'a': np.float64} | None |
| skiprows | list-like, int | 跳过指定的行 | None |
| nrows | int | 只读取前 n 行 | None |
| na_values | scalar, str, list-like, dict | 识别为 NA/NaN 的值 | None |
| encoding | str | 文件编码,如 'utf-8' | None |
返回值
- 返回类型:
pd.DataFrame - 返回一个二维标记的数据结构,即 pandas 的 DataFrame,可以对其进行各种数据分析和处理操作。
实例
通过以下示例,全面掌握 read_csv() 的各种用法。
示例 1:读取本地 CSV 文件
首先创建一个简单的 CSV 文件,然后使用 read_csv() 读取它。
实例
import pandas as pd
# 创建一个示例 CSV 文件
# 先写入一些测试数据
data = """name,age,city,salary
Tom,28,Beijing,8000
Jerry,35,Shanghai,12000
Mike,42,Guangzhou,15000
Lucy,26,Shenzhen,7000
"""
# 将数据写入文件(实际使用时可以直接读取已有文件)
with open('employees.csv', 'w', encoding='utf-8') as f:
f.write(data)
# 使用 read_csv 读取 CSV 文件
# filepath_or_buffer: 文件路径(必填)
df = pd.read_csv('employees.csv')
# 查看读取结果
print("读取的 DataFrame:")
print(df)
print("n数据类型:")
print(df.dtypes)
print("n列名:", df.columns.tolist())
# 创建一个示例 CSV 文件
# 先写入一些测试数据
data = """name,age,city,salary
Tom,28,Beijing,8000
Jerry,35,Shanghai,12000
Mike,42,Guangzhou,15000
Lucy,26,Shenzhen,7000
"""
# 将数据写入文件(实际使用时可以直接读取已有文件)
with open('employees.csv', 'w', encoding='utf-8') as f:
f.write(data)
# 使用 read_csv 读取 CSV 文件
# filepath_or_buffer: 文件路径(必填)
df = pd.read_csv('employees.csv')
# 查看读取结果
print("读取的 DataFrame:")
print(df)
print("n数据类型:")
print(df.dtypes)
print("n列名:", df.columns.tolist())
运行结果预期:
读取的 DataFrame:
name age city salary
0 Tom 28 Beijing 8000
1 Jerry 35 Shanghai 12000
2 Mike 42 Guangzhou 15000
3 Lucy 26 Shenzhen 7000
数据类型:
name object
age int64
city object
salary int64
列名: ['name', 'age', 'city', 'salary']
代码解析:
pd.read_csv('employees.csv')是最基本的用法,直接传入文件路径即可。- 默认情况下,第一行被自动识别为列名(header='infer')。
- pandas 自动推断每列的数据类型:字符串变为 object,整数变为 int64。
- 返回的 DataFrame 可以直接使用
print()查看,也可以进行后续的数据分析。
示例 2:自定义列名和选择特定列
在实际工作中,我们可能需要自定义列名,或者只读取部分列来提高性能。
实例
import pandas as pd
# 创建测试数据
data = """name,age,city,salary,department
Tom,28,Beijing,8000,IT
Jerry,35,Shanghai,12000,HR
Mike,42,Guangzhou,15000,Sales
Lucy,26,Shenzhen,7000,IT
"""
with open('employees2.csv', 'w', encoding='utf-8') as f:
f.write(data)
# 示例 2a: 自定义列名
# names 参数用于指定新的列名,会覆盖原文件的列名
df_custom = pd.read_csv('employees2.csv', names=['姓名', '年龄', '城市', '薪资', '部门'], header=0)
print("自定义列名后的 DataFrame:")
print(df_custom)
print()
# 示例 2b: 只读取指定的列
# usecols 参数可以指定只读取哪些列,提高性能
df_partial = pd.read_csv('employees2.csv', usecols=['name', 'salary'])
print("只读取部分列:")
print(df_partial)
print()
# 示例 2c: 使用 index_col 指定索引列
df_indexed = pd.read_csv('employees2.csv', index_col='name')
print("设置 name 为索引:")
print(df_indexed)
# 创建测试数据
data = """name,age,city,salary,department
Tom,28,Beijing,8000,IT
Jerry,35,Shanghai,12000,HR
Mike,42,Guangzhou,15000,Sales
Lucy,26,Shenzhen,7000,IT
"""
with open('employees2.csv', 'w', encoding='utf-8') as f:
f.write(data)
# 示例 2a: 自定义列名
# names 参数用于指定新的列名,会覆盖原文件的列名
df_custom = pd.read_csv('employees2.csv', names=['姓名', '年龄', '城市', '薪资', '部门'], header=0)
print("自定义列名后的 DataFrame:")
print(df_custom)
print()
# 示例 2b: 只读取指定的列
# usecols 参数可以指定只读取哪些列,提高性能
df_partial = pd.read_csv('employees2.csv', usecols=['name', 'salary'])
print("只读取部分列:")
print(df_partial)
print()
# 示例 2c: 使用 index_col 指定索引列
df_indexed = pd.read_csv('employees2.csv', index_col='name')
print("设置 name 为索引:")
print(df_indexed)
运行结果预期:
自定义列名后的 DataFrame:
姓名 年龄 城市 薪资 部门
0 Tom 28 Beijing 8000 IT
1 Jerry 35 Shanghai 12000 HR
2 Mike 42 Guangzhou 15000 Sales
3 Lucy 26 Shenzhen 7000 IT
只读取部分列:
name salary
0 Tom 8000
1 Jerry 12000
2 Mike 15000
3 Lucy 7000
设置 name 为索引:
age city salary department
name
Tom 28 Beijing 8000 IT
Jerry 35 Shanghai 12000 HR
Mike 42 Guangzhou 15000 Sales
Lucy 26 Shenzhen 7000 IT
代码解析:
names参数需要与数据的列数一致,如果文件有表头行,可以设置header=0来使用原表头。usecols可以传入列名列表(推荐)或列索引列表,返回的列顺序与指定顺序一致。index_col将某列设置为行索引,便于后续按索引快速查询数据。
示例 3:处理特殊数据和完善缺失值处理
CSV 文件中可能存在缺失值、特殊分隔符或需要跳过某些行的情况。
实例
import pandas as pd
# 创建包含特殊数据的 CSV 文件
# 使用分号作为分隔符,包含缺失值和NA值
data = """name;age;city;salary
Tom;28;Beijing;8000
Jerry;;Shanghai;12000
Mike;42;Guangzhou;
Lucy;26;NA;7000
"""
with open('employees3.csv', 'w', encoding='utf-8') as f:
f.write(data)
# 示例 3a: 读取分号分隔的文件
df_semicolon = pd.read_csv('employees3.csv', sep=';')
print("使用分号分隔符:")
print(df_semicolon)
print("缺失值统计:")
print(df_semicolon.isnull())
print()
# 示例 3b: 指定哪些值被视为缺失值
df_na = pd.read_csv('employees3.csv', sep=';', na_values=['NA', 'missing'])
print("自定义 NA 值后:")
print(df_na)
print()
# 示例 3c: 跳过行和限制读取行数
# 假设文件前几行是注释,可以跳过
data_with_comment = """# 这是一个员工数据文件
# 创建日期: 2024-01-01
name;age;city;salary
Tom;28;Beijing;8000
Jerry;35;Shanghai;12000
Mike;42;Guangzhou;15000
Lucy;26;Shenzhen;7000
"""
with open('employees4.csv', 'w', encoding='utf-8') as f:
f.write(data_with_comment)
# skiprows 跳过前两行(注释行)
df_skip = pd.read_csv('employees4.csv', sep=';', skiprows=2)
print("跳过注释行后:")
print(df_skip)
print()
# nrows 只读取前 3 行
df_nrows = pd.read_csv('employees4.csv', sep=';', skiprows=2, nrows=3)
print("只读取前3行:")
print(df_nrows)
# 创建包含特殊数据的 CSV 文件
# 使用分号作为分隔符,包含缺失值和NA值
data = """name;age;city;salary
Tom;28;Beijing;8000
Jerry;;Shanghai;12000
Mike;42;Guangzhou;
Lucy;26;NA;7000
"""
with open('employees3.csv', 'w', encoding='utf-8') as f:
f.write(data)
# 示例 3a: 读取分号分隔的文件
df_semicolon = pd.read_csv('employees3.csv', sep=';')
print("使用分号分隔符:")
print(df_semicolon)
print("缺失值统计:")
print(df_semicolon.isnull())
print()
# 示例 3b: 指定哪些值被视为缺失值
df_na = pd.read_csv('employees3.csv', sep=';', na_values=['NA', 'missing'])
print("自定义 NA 值后:")
print(df_na)
print()
# 示例 3c: 跳过行和限制读取行数
# 假设文件前几行是注释,可以跳过
data_with_comment = """# 这是一个员工数据文件
# 创建日期: 2024-01-01
name;age;city;salary
Tom;28;Beijing;8000
Jerry;35;Shanghai;12000
Mike;42;Guangzhou;15000
Lucy;26;Shenzhen;7000
"""
with open('employees4.csv', 'w', encoding='utf-8') as f:
f.write(data_with_comment)
# skiprows 跳过前两行(注释行)
df_skip = pd.read_csv('employees4.csv', sep=';', skiprows=2)
print("跳过注释行后:")
print(df_skip)
print()
# nrows 只读取前 3 行
df_nrows = pd.read_csv('employees4.csv', sep=';', skiprows=2, nrows=3)
print("只读取前3行:")
print(df_nrows)
运行结果预期:
使用分号分隔符:
name age city salary
0 Tom 28.0 Beijing 8000.0
1 Jerry NaN Shanghai 12000.0
2 NaN 42.0 Guangzhou NaN
3 Lucy 26.0 NA 7000.0
缺失值统计:
name age city salary
0 False False False False
1 False True False False
2 True False False True
3 False False False False
自定义 NA 值后:
name age city salary
0 Tom 28.0 Beijing 8000.0
1 Jerry NaN Shanghai 12000.0
2 NaN 42.0 Guangzhou NaN
3 Lucy 26.0 NaN 7000.0
跳过注释行后:
name age city salary
0 Tom 28 Beijing 8000
1 Jerry 35 Shanghai 12000
42 Guangzhou 15000
2 Mike
3 Lucy 26 Shenzhen 7000
只读取前3行:
name age city salary
0 Tom 28 Beijing 800本地
1 Jerry 35 Shanghai 12000
2 Mike 42 Guangzhou 15000
代码解析:
sep参数可以指定任意分隔符,如分号、制表符等。- 默认情况下,空字符串、空格等会被识别为缺失值。可以通过
na_values参数自定义被视为 NA 的值。 skiprows可以跳过文件开头的指定行数,方便处理带注释的文件。nrows限制读取的行数,适合大文件的分块读取。
注意事项
- 读取大文件时,可以考虑使用
chunksize参数分块读取,避免内存不足。 - 处理中文文件时,需要正确指定
encoding参数,常用编码有 'utf-8'、'gbk'、'gb2312' 等。 - 如果 CSV 文件没有表头行,需要设置
header=None,然后通过names参数指定列名。 - 对于格式不标准的 CSV 文件,可能需要调整
sep、quotechar等参数来正确解析。
小结
read_csv() 是 pandas 中最基础也是最重要的数据读取函数。它功能强大,支持多种分隔符、自定义列名、索引设置、缺失值处理等高级功能。
在实际数据分析工作中,掌握 read_csv() 的各种参数用法,可以高效地处理各种格式的 CSV 文件,为后续的数据清洗和分析打下坚实基础。建议读者多加练习,熟练掌握这些常用参数。

Pandas 常用函数