目录
前言
1 CSV 和文本文件
1 参数解析
1.1 基础
1.2 列、索引、名称
1.3 常规解析配置
1.4 NA 和缺失数据处理
1.5 日期时间处理
1.6 迭代
1.7 引用、压缩和文件格式
1.8 错误处理
2. 指定数据列的类型
首页 后端开发 Python教程 Python数据处理pandas中使用CSV作为IO工具的读写操作

Python数据处理pandas中使用CSV作为IO工具的读写操作

May 08, 2023 pm 04:10 PM
python csv pandas

    前言

    pandasIO API 是一组顶层的 reader 函数,比如 pandas.read_csv(),会返回一个 pandas 对象。

    而相应的 writer 函数是对象方法,如 DataFrame.to_csv()

    注意:后面会用到 StringIO,请确保导入

    # python3
    from io import StringIO
    # python2
    from StringIO import StringIO
    登录后复制

    1 CSV 和文本文件

    读取文本文件的主要函数是 read_csv()

    1 参数解析

    read_csv() 接受以下常用参数:

    1.1 基础

    filepath_or_buffer: 变量

    • 可以是文件路径、文件 URL 或任何带有 read() 函数的对象

    sep: str,默认 ,,对于 read_table\t

    • 文件分隔符,如果设置为 None,则 C 引擎无法自动检测分隔符,而 Python 引擎可以通过内置的嗅探器工具自动检测分隔符。

    • 此外,如果设置的字符长度大于 1,且不是 '\s+',那么该字符串会被解析为正则表达式,且强制使用 Python 解析引擎。

    • 例如 '\\r\\t',但是正则表达式容易忽略文本中的引用数据。

    delimiter: str, 默认为 None

    • sep 的替代参数,功能一致

    1.2 列、索引、名称

    header: intlist, 默认为 'infer'

    • 用作列名的行号,默认行为是对列名进行推断:

      • 如果未指定 names 参数其行为类似于 header=0,即从读取的第一行开始推断。

      • 如果设置了 names,则行为与 header=None 相同。

    • 也可以为 header 设置列表,表示多级列名。如 [0,1,3],未指定的行(这里是 2)将会被跳过,如果 skip_blank_lines=True,则会跳过空行和注释的行。因此 header=0 并不是代表文件的第一行

    names: array-like, 默认为 None

    • 需要设置的列名列表,如果文件中不包含标题行,则应显式传递 header=None,且此列表中不允许有重复值。

    index_col: int, str, sequence of int/str, False, 默认为 None

    • 用作 DataFrame 的索引的列,可以字符串名称或列索引的形式给出。如果指定了列表,则使用 MultiIndex

    • 注意:index_col=False 可用于强制 pandas 不要将第一列用作索引。例如,当您的文件是每行末尾都带有一个分隔符的错误文件时。

    usecols: 列表或函数, 默认为 None

    • 只读取指定的列。如果是列表,则所有元素都必须是位置(即文件列中的整数索引)或字符串,这些字符串必须与 names 参数提供的或从文档标题行推断出的列名相对应。

    • 列表中的顺序会被忽略,即 usecols=[0, 1] 等价于 [1, 0]

    • 如果是可调用函数,将会根据列名计算,返回可调用函数计算为 True 的名称

    In [1]: import pandas as pd
    In [2]: from io import StringIO
    In [3]: data = "col1,col2,col3\na,b,1\na,b,2\nc,d,3"
    In [4]: pd.read_csv(StringIO(data))
    Out[4]: 
      col1 col2  col3
    0    a    b     1
    1    a    b     2
    2    c    d     3
    In [5]: pd.read_csv(StringIO(data), usecols=lambda x: x.upper() in ["COL1", "COL3"])
    Out[5]: 
      col1  col3
    0    a     1
    1    a     2
    2    c     3
    登录后复制

    使用此参数可以大大加快解析时间并降低内存使用

    squeeze: boolean, 默认为 False

    • 如果解析的数据只包含一列,那么返回一个 Series

    prefix: str, 默认为 None

    • 当没有标题时,添加到自动生成的列号的前缀,例如 'X' 表示 X0, X1...

    mangle_dupe_cols: boolean, 默认为 True

    • 重复的列将被指定为 'X','X.1''X.N',而不是 'X'... 。如果在列中有重复的名称,传递 False 将导致数据被覆盖

    1.3 常规解析配置

    dtype: 类型名或类型字典(column -> type), 默认为 None

    • 数据或列的数据类型。例如。 {'a':np.float64,'b':np.int32}

    engine: {'c', 'python'}

    • 要使用的解析器引擎。C 引擎更快,而 Python 引擎目前功能更完整

    converters: dict, 默认为 None

    • 用于在某些列中对值进行转换的函数字典。键可以是整数,也可以是列名

    true_values: list, 默认为 None

    • 数据值解析为 True

    false_values: list, 默认为 None

    • 数据值解析为 False

    skipinitialspace: boolean, 默认为 False

    • 跳过分隔符之后的空格

    skiprows: 整数或整数列表, 默认为 None

    • 在文件开头要跳过的行号(索引为 0)或要跳过的行数

    • 如果可调用函数,则对索引应用函数,如果返回 True,则应跳过该行,否则返回 False

    In [6]: data = "col1,col2,col3\na,b,1\na,b,2\nc,d,3"
    In [7]: pd.read_csv(StringIO(data))
    Out[7]: 
      col1 col2  col3
    0    a    b     1
    1    a    b     2
    2    c    d     3
    In [8]: pd.read_csv(StringIO(data), skiprows=lambda x: x % 2 != 0)
    Out[8]: 
      col1 col2  col3
    0    a    b     2
    登录后复制

    skipfooter: int, 默认为 0

    • 需要跳过文件末尾的行数(不支持 C 引擎)

    nrows: int, 默认为 None

    • 要读取的文件行数,对于读取大文件很有用

    memory_map: boolean, 默认为 False

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

    1.4 NA 和缺失数据处理

    na_values: scalar, str, list-like, dict, 默认为 None

    • 需要转换为 NA 值的字符串

    keep_default_na: boolean, 默认为 True

    • 解析数据时是否包含默认的 NaN 值。根据是否传入 na_values,其行为如下

    • keep_default_na=True, 且指定了 na_values, na_values 将会与默认的 NaN 一起被解析

    • keep_default_na=True, 且未指定 na_values, 只解析默认的 NaN

    • keep_default_na=False, 且指定了 na_values, 只解析 na_values 指定的 NaN

    • keep_default_na=False, 且未指定 na_values, 字符串不会被解析为 NaN

    注意:如果 na_filter=False,那么 keep_default_nana_values 参数将被忽略

    na_filter: boolean, 默认为 True

    • 检测缺失值标记(空字符串和 na_values 的值)。在没有任何 NA 的数据中,设置 na_filter=False 可以提高读取大文件的性能

    skip_blank_lines: boolean, 默认为 True

    • 如果为 True,则跳过空行,而不是解释为 NaN

    1.5 日期时间处理

    parse_dates: 布尔值、列表或嵌套列表、字典, 默认为 False.

    • 如果为 True -> 尝试解析索引

    • 如果为 [1, 2, 3] -> 尝试将 1, 2, 3 列解析为分隔的日期

    • 如果为 [[1, 3]] -> 将 1, 3 列解析为单个日期列

    • 如果为 {'foo': [1, 3]} -> 将 1, 3 列作为日期并设置列名为 foo

    infer_datetime_format: 布尔值, 默认为 False

    • 如果设置为 True 且设置了 parse_dates,则尝试推断 datetime 格式以加快处理速度

    date_parser: 函数, 默认为 None

    • 用于将字符串序列转换为日期时间实例数组的函数。默认使用 dateutil.parser.parser 进行转换,pandas 将尝试以三种不同的方式调用 date_parser

      • 传递一个或多个数组(parse_dates 定义的列)作为参数;

      • parse_dates 定义的列中的字符串值连接到单个数组中,并将其传递;

      • 使用一个或多个字符串(对应于 parse_dates 定义的列)作为参数,对每一行调用 date_parser 一次。

    dayfirst: 布尔值, 默认为 False

    • DD/MM 格式的日期

    cache_dates: 布尔值, 默认为 True

    • 如果为 True,则使用唯一的、经过转换的日期缓存来应用 datetime 转换。

    • 在解析重复的日期字符串,特别是带有时区偏移量的日期字符串时,可能会显著提高速度。

    1.6 迭代

    iterator: boolean, 默认为 False

    • 返回 TextFileReader 对象以进行迭代或使用 get_chunk() 来获取块

    1.7 引用、压缩和文件格式

    compression: {'infer', 'gzip', 'bz2', 'zip', 'xz', None, dict}, 默认为 'infer'

    • 用于对磁盘数据进行即时解压缩。如果为 "infer",则如果 filepath_or_buffer 是文件路径且以 ".gz"".bz2"".zip"".xz" 结尾,则分别使用 gzipbz2zipxz 解压,否则不进行解压缩。

    • 如果使用 "zip",则 ZIP 文件必须仅包含一个要读取的数据文件。设置为 None 表示不解压

    • 也可以使用字典的方式,键为 method 的值从 {'zip', 'gzip', 'bz2'} 中选择。例如

    compression={'method': 'gzip', 'compresslevel': 1, 'mtime': 1}
    登录后复制

    thousandsstr, 默认为 None

    • 数值在千位的分隔符

    decimal: str, 默认为 '.'

    • 小数点

    float_precision: string, 默认为 None

    • 指定 C 引擎应该使用哪个转换器来处理浮点值。普通转换器的选项为 None,高精度转换器的选项为 high,双向转换器的选项为 round_trip

    quotechar: str (长度为 1)

    • 用于表示被引用数据的开始和结束的字符。带引号的数据里的分隔符将被忽略

    comment: str, 默认为 None

    • 用于跳过该字符开头的行,例如,如果 comment='#',将会跳过 # 开头的行

    encoding: str, 默认为 None

    • 设置编码格式

    1.8 错误处理

    error_bad_linesboolean, 默认为 True

    • 默认情况下,字段太多的行(例如,带有太多逗号的 csv 文件)会引发异常,并且不会返回任何 DataFrame

    • 如果设置为 False,则这些坏行将会被删除

    warn_bad_linesboolean, 默认为 True

    • 如果 error_bad_lines=Falsewarn_bad_lines=True,每个坏行都会输出一个警告

    2. 指定数据列的类型

    您可以指示整个 DataFrame 或各列的数据类型

    In [9]: import numpy as np
    In [10]: data = "a,b,c,d\n1,2,3,4\n5,6,7,8\n9,10,11"
    In [11]: print(data)
    a,b,c,d
    1,2,3,4
    5,6,7,8
    9,10,11
    In [12]: df = pd.read_csv(StringIO(data), dtype=object)
    In [13]: df
    Out[13]: 
       a   b   c    d
    0  1   2   3    4
    1  5   6   7    8
    2  9  10  11  NaN
    In [14]: df["a"][0]
    Out[14]: '1'
    In [15]: df = pd.read_csv(StringIO(data), dtype={"b": object, "c": np.float64, "d": "Int64"})
    In [16]: df.dtypes
    Out[16]: 
    a      int64
    b     object
    c    float64
    d      Int64
    dtype: object
    登录后复制

    你可以使用 read_csv()converters 参数,统一某列的数据类型

    In [17]: data = "col_1\n1\n2\n'A'\n4.22"
    In [18]: df = pd.read_csv(StringIO(data), converters={"col_1": str})
    In [19]: df
    Out[19]: 
      col_1
    0     1
    1     2
    2   'A'
    3  4.22
    In [20]: df["col_1"].apply(type).value_counts()
    Out[20]: 
    <class &#39;str&#39;>    4
    Name: col_1, dtype: int64
    登录后复制

    或者,您可以在读取数据后使用 to_numeric() 函数强制转换类型

    In [21]: df2 = pd.read_csv(StringIO(data))
    In [22]: df2["col_1"] = pd.to_numeric(df2["col_1"], errors="coerce")
    In [23]: df2
    Out[23]: 
       col_1
    0   1.00
    1   2.00
    2    NaN
    3   4.22
    In [24]: df2["col_1"].apply(type).value_counts()
    Out[24]: 
    <class &#39;float&#39;>    4
    Name: col_1, dtype: int64
    登录后复制

    它将所有有效的数值转换为浮点数,而将无效的解析为 NaN

    最后,如何处理包含混合类型的列取决于你的具体需要。在上面的例子中,如果您只想要将异常的数据转换为 NaN,那么 to_numeric() 可能是您的最佳选择。

    然而,如果您想要强制转换所有数据,而无论类型如何,那么使用 read_csv()converters 参数会更好

    注意

    在某些情况下,读取包含混合类型列的异常数据将导致数据集不一致。

    如果您依赖 pandas 来推断列的类型,解析引擎将继续推断数据块的类型,而不是一次推断整个数据集。

    In [25]: col_1 = list(range(500000)) + ["a", "b"] + list(range(500000))
    In [26]: df = pd.DataFrame({"col_1": col_1})
    In [27]: df.to_csv("foo.csv")
    In [28]: mixed_df = pd.read_csv("foo.csv")
    In [29]: mixed_df["col_1"].apply(type).value_counts()
    Out[29]: 
    <class &#39;int&#39;>    737858
    <class &#39;str&#39;>    262144
    Name: col_1, dtype: int64
    In [30]: mixed_df["col_1"].dtype
    Out[30]: dtype(&#39;O&#39;)
    登录后复制

    这就导致 mixed_df 对于列的某些块包含 int 类型,而对于其他块则包含 str,这是由于读取的数据是混合类型。

    以上是Python数据处理pandas中使用CSV作为IO工具的读写操作的详细内容。更多信息请关注PHP中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    AI Hentai Generator

    AI Hentai Generator

    免费生成ai无尽的。

    热门文章

    R.E.P.O.能量晶体解释及其做什么(黄色晶体)
    1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳图形设置
    1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
    威尔R.E.P.O.有交叉游戏吗?
    1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    PHP和Python:代码示例和比较 PHP和Python:代码示例和比较 Apr 15, 2025 am 12:07 AM

    PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

    Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

    Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

    CentOS上PyTorch的GPU支持情况如何 CentOS上PyTorch的GPU支持情况如何 Apr 14, 2025 pm 06:48 PM

    在CentOS系统上启用PyTorchGPU加速,需要安装CUDA、cuDNN以及PyTorch的GPU版本。以下步骤将引导您完成这一过程:CUDA和cuDNN安装确定CUDA版本兼容性:使用nvidia-smi命令查看您的NVIDIA显卡支持的CUDA版本。例如,您的MX450显卡可能支持CUDA11.1或更高版本。下载并安装CUDAToolkit:访问NVIDIACUDAToolkit官网,根据您显卡支持的最高CUDA版本下载并安装相应的版本。安装cuDNN库:前

    docker原理详解 docker原理详解 Apr 14, 2025 pm 11:57 PM

    Docker利用Linux内核特性,提供高效、隔离的应用运行环境。其工作原理如下:1. 镜像作为只读模板,包含运行应用所需的一切;2. 联合文件系统(UnionFS)层叠多个文件系统,只存储差异部分,节省空间并加快速度;3. 守护进程管理镜像和容器,客户端用于交互;4. Namespaces和cgroups实现容器隔离和资源限制;5. 多种网络模式支持容器互联。理解这些核心概念,才能更好地利用Docker。

    CentOS上PyTorch的分布式训练如何操作 CentOS上PyTorch的分布式训练如何操作 Apr 14, 2025 pm 06:36 PM

    在CentOS系统上进行PyTorch分布式训练,需要按照以下步骤操作:PyTorch安装:前提是CentOS系统已安装Python和pip。根据您的CUDA版本,从PyTorch官网获取合适的安装命令。对于仅需CPU的训练,可以使用以下命令:pipinstalltorchtorchvisiontorchaudio如需GPU支持,请确保已安装对应版本的CUDA和cuDNN,并使用相应的PyTorch版本进行安装。分布式环境配置:分布式训练通常需要多台机器或单机多GPU。所

    minio安装centos兼容性 minio安装centos兼容性 Apr 14, 2025 pm 05:45 PM

    MinIO对象存储:CentOS系统下的高性能部署MinIO是一款基于Go语言开发的高性能、分布式对象存储系统,与AmazonS3兼容。它支持多种客户端语言,包括Java、Python、JavaScript和Go。本文将简要介绍MinIO在CentOS系统上的安装和兼容性。CentOS版本兼容性MinIO已在多个CentOS版本上得到验证,包括但不限于:CentOS7.9:提供完整的安装指南,涵盖集群配置、环境准备、配置文件设置、磁盘分区以及MinI

    CentOS上PyTorch版本怎么选 CentOS上PyTorch版本怎么选 Apr 14, 2025 pm 06:51 PM

    在CentOS系统上安装PyTorch,需要仔细选择合适的版本,并考虑以下几个关键因素:一、系统环境兼容性:操作系统:建议使用CentOS7或更高版本。CUDA与cuDNN:PyTorch版本与CUDA版本密切相关。例如,PyTorch1.9.0需要CUDA11.1,而PyTorch2.0.1则需要CUDA11.3。cuDNN版本也必须与CUDA版本匹配。选择PyTorch版本前,务必确认已安装兼容的CUDA和cuDNN版本。Python版本:PyTorch官方支

    Python:自动化,脚本和任务管理 Python:自动化,脚本和任务管理 Apr 16, 2025 am 12:14 AM

    Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。

    See all articles