前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas.read_csv 详细介绍

pandas.read_csv 详细介绍

作者头像
Twcat_tree
发布2022-12-05 17:21:32
5.1K0
发布2022-12-05 17:21:32
举报
文章被收录于专栏:二猫の家二猫の家二猫の家

《Pandas 教程》 修订中,可作为 Pandas 入门进阶课程、Pandas 中文手册、用法大全,配有案例讲解和速查手册。提供建议、纠错、催更等加作者微信: sinbam 和关注公众号「盖若」ID: gairuo。查看更新日志。

pandas.read_csv 接口用于读取 CSV 格式数据文件,由于它使用非常频繁,功能强大参数众多,所以在这里专门做详细介绍, 我们在使用过程中可以查阅。

读 Excel 文件等方法会有很多相同的参数,用法基本一致。

语法 它的语法如下:

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)

参数 文件 filepath_or_buffer 这是一个默认参数据,没有参数名,不能为空。

可以传文件路径:

# filepath_or_bufferstr, path object or file-like object
# 本地相对路径:
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')
#  Amazon S3, 安装支持库 fsspec
pd.read_csv(
    "s3://ncei-wcsd-archive/data/processed/SH1305/18kHz/SaKe2013"
    "-D20130523-T080854_to_SaKe2013-D20130523-T085643.csv",
    storage_options={"anon": True},
)

需要注意的是,mac 和 windows 的路径写法不一样,上例是 mac 写法,windows 需要换成类似 data\data.csv 及 ‘E: \data\data.csv’

可以传数据字符串,即 csv 中的数据字符,以字符串直接传入

from io import StringIO
data = ('col1,col2,col3\n'
        'a,b,1\n'
        'a,b,2\n'
        'c,d,3')
pd.read_csv(StringIO(data))

StringIO

from io import StringIO
pd.read_csv(StringIO(data), dtype=object)

也可以传入字节数据:

from io import BytesIO
data = (b'word,length\n'
        b'Tr\xc3\xa4umen,7\n'
        b'Gr\xc3\xbc\xc3\x9fe,5')
pd.read_csv(BytesIO(data))

注:字节数据经常会放在缓冲中来传递。

buf = BytesIO()

# buf 可认为一个存储位置来使用
buf.getbuffer()

也可以用 read() 打开的文件再传递,不过几乎没人这么做。

分隔符 sep 字符型,每行数据内容分隔符号,默认是 , 逗号,另外常见的还有 tab 符 \t,空格等,根据数据实际的情况传值。

# str, default ‘,’
# 数据分隔转化是逗号, 如果是其他可以指定
pd.read_csv(data, sep='\t') # 制表符分隔 tab
pd.read_table(data) # read_table 默认是制表符分隔 tab
pd.read_csv(data, sep='|') # 制表符分隔 tab
pd.read_csv(data,sep="(?<!a)\|(?!1)", engine='python') # 使用正则

分隔符 delimiter str, default None

定界符,备选分隔符,sep 的别名,效果和它一样。如果指定该参数,则sep参数失效。

表头 header 支持 int, list of int,第几行是表头,默认会自动推断,会把第一行作为表头。

# int, list of int, default ‘infer’
# 默认系统会推断,如果指定列名会被忽略
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 表示第一行数据而非文件的第一行.

列名 names 如果文件不包含列名,那么应该设置 header=None,列名列表中不允许有重复值。

# array-like, optional
pd.read_csv(data, names=['列1', '列2']) # 指定列名列表

索引列 index_col 用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。如果文件不规则,行尾有分隔符,则可以设定index_col=False 来是的pandas不适用第一列作为行索引。

# int, str, sequence of int / str, or False, default None
# 默认为 `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]) # 按列索引指定多个索引

使用部分列 usecols 选取部分列,使用这个参数可以加快加载速度并降低内存消耗。

# list-like or callable, optional
# 读取部分列
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'])

返回序列 squeeze 如果文件值包含一列,则返回一个 Series,如果多个列无论如何还是 DataFrame。

# bool, default False
# 下例只取一个列会返回一个 Series
pd.read_csv(data, usecols=[0], squeeze=True)
# 有两列则还是 df
pd.read_csv(data, usecols=[0, 2], squeeze=True)

表头前缀 prefix 如没列名,自动指定一个前缀下划线线序数的名称,如 n0、n1。

# str, optional
# 表头为 c_0、c_2
pd.read_csv(data, prefix='c_', header=None)

处理重复列名 mangle_dupe_cols 当列名有重复时,解析列名将变为 ‘X’, ‘X.1’…’X.N’而不是 ‘X’…’X’。 如果该参数为 False ,那么当列名中有重复时,前列将会被后列覆盖。

# bool, default True
data = 'a,b,a\n0,1,2\n3,4,5'
pd.read_csv(StringIO(data), mangle_dupe_cols=True)
# 表头为 a b a.1
# False 会报 ValueError 错误

数据类型 dtype pandas 的数据类型可参考 dtypes。

# Type name or dict of column -> type, optional
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]) # 依次指定

引擎 engine 使用的分析引擎,可以选择C或者是python。C 语言速度最快,python 的功能最为完善。

# engine=None, {'c', 'python'}, optional
pd.read_csv(data, engine='c')

列数据处理 converters 对列的数据进行转换,列名与函数组成的字典。key 可以是列名或者列的序号。

# dict, default None
data = 'x,y\na,1\nb,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})

真值转换 true_values 将指定的文本转换为 True, 可以用列表指定多个值。

# list, default None
data = ('a,b,c\n1,Yes,2\n3,No,4')
pd.read_csv(StringIO(data),
            true_values=['Yes'], false_values=['No'])

假值转换 false_values 同上边的 true_values

忽略分隔符后空白 skipinitialspace 忽略分隔符后的空白(默认为False,即不忽略)。

# boolean, default False
data = 'a, b, c\n 1, 2, 3\n 4 ,5, 6'
pd.read_csv(StringIO(data), skipinitialspace=True)

跳过指定行 skiprows 需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。

# list-like, int or callable, optional
# 跳过前三行
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)

尾部跳过 skipfooter 从文件尾部开始忽略。 (c引擎不支持)

# int, default 0
pd.read_csv(filename, skipfooter=1) # 最后一行不加载

读取行数 nrows 需要读取的行数,从文件开关算起,经常用于较大的数据,先取部分进行代码编写。

# int, default None
pd.read_csv(data, nrows=1000)

空值替换 na_values 一组用于替换 NA/NaN 的值。如果传参,需要制定特定列的空值。这些值为认为是空值 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 的配合使用和影响。

# scalar, str, list-like, or dict, default 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]})

保留默认空值 keep_default_na 分析数据时是否包含默认的NaN值,是否自动识别。如果指定 na_values 参数,并且 keep_default_na=False,那么默认的NaN将被覆盖,否则添加。

和 na_values 的关系是:

keep_default_na na_values 逻辑 True 指定 na_values 的配置附加处理 True 未指定 自动识别 False 指定 使用 na_values 的配置 False 未指定 不做处理 注:如果 na_filter 为 False (默认是 True), 那么 keep_default_na 和 na_values parameters 均无效。

# boolean, default True
# 不自动识别空值
pd.read_csv(data, keep_default_na=False)

丢失值检查 na_filter 是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有空值,设定na_filter=False 可以提升读取速度。

# boolean, default True
pd.read_csv(data, na_filter=False) # 不检查

解析信息 verbose 是否打印各种解析器的输出信息,例如:“非数值列中缺失值的数量”等。

# boolean, default False
# 可以看到解析信息
pd.read_csv(data, verbose=True)
# Tokenization took: 0.02 ms
# Type conversion took: 0.36 ms
# Parser memory cleanup took: 0.01 ms

跳过空行 skip_blank_lines 是否跳过空行,如果为 True,则跳过空行,否则数据记为 NaN。

# boolean, default True
# 不跳过空行
pd.read_csv(data, skip_blank_lines=False)

注意:如果 skip_blank_lines=True,header 参数将忽略空行和注释行, 因此 header=0 表示第一行数据而非文件的第一行.

日期时间解析 parse_dates 本参数对时间日期进行解析。

# boolean or list of ints or names or list of lists or dict, default False.
pd.read_csv(data, parse_dates=True) # 自动解析日期时间格式
pd.read_csv(data, parse_dates=['年份']) # 指定日期时间字段进行解析
# 将 1、4 列合并解析成名为 时间的 时间类型列
pd.read_csv(data, parse_dates={'时间':[1,4]})

自动识别日期时间 infer_datetime_format 如果设定为True并且parse_dates 可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10倍。

# boolean, default False
pd.read_csv(data, parse_dates=True, infer_datetime_format=True)

保留被组合时间列 keep_date_col 如果有多列解析成一个列,自动会合并到新解析的列,去掉此列,如果设置为 True 则会保留。

# boolean, default False
pd.read_csv(data, parse_dates=[[1, 2], [1, 3]], keep_date_col=True)

日期时间解析器 date_parser 用于解析日期的函数,默认使用dateutil.parser.parser来做转换。Pandas 尝试使用三种不同的方式解析,如果遇到问题则使用下一种方式。

使用一个或者多个arrays(由parse_dates指定)作为参数; 连接指定多列字符串作为一个列作为参数; 每行调用一次date_parser函数来解析一个或者多个字符串(由parse_dates指定)作为参数。

# function, default None
# 指定时间解析库,默认是 dateutil.parser.parser
date_parser=pd.io.date_converters.parse_date_time
date_parser=lambda x: pd.to_datetime(x, utc=True, format='%d%b%Y')
date_parser = lambda d: pd.datetime.strptime(d, '%d%b%Y')
# 使用
pd.read_csv(data, parse_dates=['年份'], date_parser=date_parser)

日期日在前 dayfirst DD/MM格式的日期类型,如日期 2000-01-06 如果 dayfirst=True 则会转换成 2000-06-01。

# boolean, default False
pd.read_csv(data, dayfirst=True, parse_dates=[0])

cache_dates 如果为 True,则使用唯一的转换日期缓存来应用 datetime 转换。 解析重复的日期字符串时,尤其是带有时区偏移的日期字符串时,可能会大大提高速度。

# boolean, default True
pd.read_csv(data, cache_dates=False)

读文件对象 iterator 返回一个TextFileReader 对象,以便逐块处理文件。

# boolean, default False
pd.read_csv(data, iterator=True)

文件块 chunksize 文件块的大小,分块处理大型csv文件。

# int, default 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}, default 'infer'
pd.read_csv('sample.tar.gz', compression='gzip')

千分位分割符 thousands 千位分隔符。

# str, default None
pd.read_csv('test.csv', thousands=',') # 逗号分隔

小数点 decimal 识别字符的小数点。 例如。 对于欧洲数据,请使用“,”。

# str, default '.'
pd.read_csv(data, decimal=",")

行结束符 lineterminator 行结束符,将文件分成几行的字符。 仅对C解析器有效。

# str (length 1), default None
data = 'a,b,c~1,2,3~4,5,6'
pd.read_csv(StringIO(data), lineterminator='~')

引号 quotechar 用于表示引用数据的开始和结束的字符。 引用的项目可以包含定界符,它将被忽略。

# str (length 1)
pd.read_csv(file, quotechar = '"')

引号常量 quoting 控制csv中的引号常量。每个csv.QUOTE_ *常量的控制字段引用行为。 使用QUOTE_MINIMAL(0),QUOTE_ALL(1),QUOTE_NONNUMERIC(2)或QUOTE_NONE(3)中的一种。

# int or csv.QUOTE_* instance, default 0
import csv
pd.read_csv('input_file.csv', quoting=csv.QUOTE_NONE)

双引号 doublequote 双引号,当单引号已经被定义,并且quoting 参数不是QUOTE_NONE的时候,使用双引号表示引号内的元素作为一个元素使用。

# boolean, default True
import csv
pd.read_csv('data.csv', quotechar='"', doublequote=True, quoting=csv.QUOTE_NONNUMERIC)

不受分隔符限值 escapechar 当quoting 为QUOTE_NONE时,指定一个字符使的不受分隔符限值。

# str (length 1), default None
pd.read_csv(StringIO(data), escapechar='\\', encoding='utf-8')

注释标识 comment 指示不应分析行的部分。 如果在一行的开头找到该行,则将完全忽略该行。 此参数必须是单个字符。 像空行一样(只要skip_blank_lines = True),参数视为header会忽略完全注释的行,而skiprows 行会忽略。 例如,如果comment =’#’,则解析header= 0的’#empty \ na,b,c \ n1,2,3’会将’a,b,c’视为header。

# str, default None
s = '# notes\na,b,c\n# more notes\n1,2,3'
pd.read_csv(StringIO(s), sep=',', comment='#', skiprows=1)

编码 encoding 指定字符集类型,通常指定为’utf-8’。 参见 Python标准编码列表。

# str, default None
pd.read_csv('gairuo.csv', encoding='utf8')
pd.read_csv("gairuo.csv",encoding="gb2312") # 常见中文
# 其他常用编码 ISO-8859-1 latin-1 gbk

如果不知道文件是什么编码,可以借助 codecs 和 chardet 这两个三方库在检测文件的编码方式。

dialect 如果提供,则此参数将覆盖以下参数的值(默认值或未设置):delimiter, doublequote, escapechar, skipinitialspace, quotechar 和 quoting。 如果有必要覆盖值,则将发出 ParserWarning。 有关更多详细信息,请参见 csv.Dialect文档。

# str or csv.Dialect instance, default None
import csv
csv.register_dialect(
    'mydialect',
    delimiter = ',',
    quotechar = '"',
    doublequote = True,
    skipinitialspace = True,
    lineterminator = '\r\n',
    quoting = csv.QUOTE_MINIMAL)
pd.read_csv(“gr.csv”, encoding=“gbk”, dialect=‘mydialect’)

坏行处理 error_bad_lines 默认情况下,字段太多的行(例如,带有太多逗号的csv行)会引发异常,并且不会返回任何DataFrame。 如果为False,则这些“坏行”将从返回的DataFrame中删除。 请参阅下面的坏行。

# boolean, default True
pd.read_csv(StringIO(data), error_bad_lines=False)

坏行警告 warn_bad_lines 如果error_bad_lines为False,而warn_bad_lines为True,则将为每个“坏行”输出警告。

# boolean, default True
pd.read_csv(StringIO(data), warn_bad_lines=False)

空格分隔符 delim_whitespace 指定是否将空格(例如’‘或’\ t’)用作分隔符。 等效于设置sep =’\s+’。 如果此选项设置为True,则不应该为delimiter参数传递任何内容。

# boolean, default False
pd.read_csv(StringIO(data), delim_whitespace=False)

低内存 low_memory 在内部对文件进行分块处理,从而在解析时减少了内存使用,但可能是混合类型推断。 要确保没有混合类型,请设置False或使用dtype参数指定类型。 请注意,无论使用chunksize还是iterator参数以块形式返回数据,整个文件都将被读取到单个DataFrame中。(仅对C解析器有效)

# boolean, default True
pd.read_csv(StringIO(data), low_memory=False)

内存映射 memory_map 如果为filepath_or_buffer提供了文件路径,则将文件对象直接映射到内存中并直接从那里访问数据。 使用此选项可以提高性能,因为不再有任何I / O开销。

# boolean, default False
pd.read_csv('gr.csv', low_memory=False)

高精度转换 float_precision 指定C引擎应使用哪个转换器进行浮点运算,对于普通转换器,选项为“None”或“high”,原始低精度转换器的“legacy”,以及 round-trip 换器的“ round_trip”。

# string, default None
val = '0.3066101993807095471566981359501369297504425048828125'
data = 'a,b,c\n1,2,{0}'.format(val)
abs(pd.read_csv(StringIO(data), engine='c',float_precision='high')['c'][0] - float(val))

存储选项 storage_options 注:pandas 1.2.0 新增。

fsspec 还允许使用复杂的URL,以访问压缩档案中的数据,文件的本地缓存等。 要在本地缓存上面的示例,可以增加参数配置:

#  Amazon S3, 安装支持库 fsspec
pd.read_csv(
    "simplecache::s3://ncei-wcsd-archive/data/processed/SH1305/18kHz/"
    "SaKe2013-D20130523-T080854_to_SaKe2013-D20130523-T085643.csv",
    storage_options={"s3": {"anon": True}},
)

在这里,我们指定“anon”参数用于实现的“ s3”部分,而不是用于缓存实现。 请注意,这仅在会话期间缓存到临时目录,但是您也可以指定永久存储。更多参数可参考fsspec文档

返回 一般情况下,会将读取到的数据返回一个 DataFrame,当然按照参数的要求会返回指定的类型。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档