read_csv() 函数功能强大,可以灵活地将 CSV 文件读取为 DataFrame,是数据分析的第一步。
最简单的用法只需传入文件路径:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())
如果文件在工作目录下,直接写文件名;否则需要提供完整路径。同时支持读取网络上的 CSV 文件(传入 URL)。
read_csv() 有数十个参数,下面列出最常用的几个:
sep / delimiter指定分隔符,默认为逗号 ,。对于制表符分隔的文件可使用 sep='\t'。
pd.read_csv('data.tsv', sep='\t')
header指定作为列名的行号(从0开始)。默认为0(第一行)。若文件无列名,设置 header=None,并可用 names 参数指定列名。
pd.read_csv('data.csv', header=None, names=['A','B','C'])
names自定义列名,需与 header=None 配合使用,或用于替换原有的列名。
pd.read_csv('data.csv', names=['ID','Name','Age'])
index_col指定某列作为行索引。可以是列号(整数)或列名(字符串)。
pd.read_csv('data.csv', index_col=0)
usecols只读取指定的列,提高效率。可传入列号列表或列名列表。
pd.read_csv('data.csv', usecols=['Name','Age'])
dtype为列指定数据类型,避免自动推断错误或节省内存。
pd.read_csv('data.csv', dtype={'Age': int, 'Price': float})
skiprows跳过文件开头的指定行数(或行号列表)。常用于跳过注释或无关内容。
pd.read_csv('data.csv', skiprows=2) # 跳过前两行
pd.read_csv('data.csv', skiprows=[0,2]) # 跳过第1行和第3行
nrows只读取前 n 行,适用于快速预览或处理大文件的一部分。
pd.read_csv('data.csv', nrows=100)
encoding指定文件编码,常见为 'utf-8'、'gbk' 等。解决中文乱码问题。
pd.read_csv('data.csv', encoding='gbk')
na_values指定额外的缺失值标记,这些值会被转换为 NaN。
pd.read_csv('data.csv', na_values=['NA', 'NULL', '-'])
parse_dates将指定的列解析为日期类型。
pd.read_csv('data.csv', parse_dates=['Date'])
chunksize返回一个迭代器,用于逐块读取大文件,避免内存不足。
for chunk in pd.read_csv('big.csv', chunksize=10000):
process(chunk)
假设我们有一个名为 employees.csv 的文件,内容如下:
ID,Name,Age,Salary,HireDate
101,张三,28,8000,2020-06-15
102,李四,35,12000,2018-03-20
103,王五,29,9500,2021-09-10
104,赵六,41,15000,2015-12-01
现在使用各种参数进行读取:
import pandas as pd
# 1. 基本读取
df = pd.read_csv('employees.csv')
print(df.head())
# 2. 指定ID列为行索引,并将HireDate解析为日期
df2 = pd.read_csv('employees.csv', index_col='ID', parse_dates=['HireDate'])
print(df2.info())
# 3. 只读取Name、Salary两列,并设置Salary为float32类型
df3 = pd.read_csv('employees.csv', usecols=['Name', 'Salary'], dtype={'Salary': 'float32'})
print(df3)
# 4. 处理缺失值:假设文件中用'NULL'表示缺失,并指定编码
df4 = pd.read_csv('employees.csv', na_values=['NULL'], encoding='utf-8')
print(df4.isna().sum())
UnicodeDecodeError,尝试更换 encoding 参数,例如 encoding='gbk' 或 encoding='latin1'。
sep='\s+' 使用正则匹配连续空白。
chunksize 分块处理,或指定 dtype 减少内存占用。
header=None 并手动指定 names。
df.info() 和 df.head() 检查数据是否正确。对于大文件,可以先读一小部分(nrows=1000)来预览。