Python数据处理pandas读写操作IO工具CSV

目录
  • 前言
  • 1 CSV 和文本文件
    • 1 参数解析
      • 1.1 基础
      • 1.2 列、索引、名称
      • 1.3 常规解析配置
      • 1.4 NA 和缺失数据处理
      • 1.5 日期时间处理
      • 1.6 迭代
      • 1.7 引用、压缩和文件格式
      • 1.8 错误处理
    • 2. 指定数据列的类型

前言

前面我们介绍了 pandas 的基础语法操作,下面我们开始介绍 pandas 的数据读写操作。

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

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

下面列出了所有的 readerwriter 函数

注意:后面会用到 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 'str'>    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 'float'>    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 'int'>    737858
<class 'str'>    262144
Name: col_1, dtype: int64
In [30]: mixed_df["col_1"].dtype
Out[30]: dtype('O')

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

以上就是Python pandas数据读写操作IO工具CSV的详细内容,更多关于Python pandas数据读写的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python数据处理的26个Pandas实用技巧总结

    目录 从剪贴板中创建DataFram 将DataFrame划分为两个随机的子集 多种类型过滤DataFrame DataFrame筛选数量最多类别 处理缺失值 一个字符串划分成多列 Series扩展成DataFrame 对多个函数进行聚合 聚合结果与DataFrame组合 选取行和列的切片 MultiIndexedSeries重塑 创建数据透视表 连续数据转类别数据 StyleaDataFrame 额外技巧 ProfileaDataFrame 大家好,今天给大家分享一篇 pandas 实用技巧,

  • Python 数据处理库 pandas 入门教程基本操作

    pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程. pandas提供了快速,灵活和富有表现力的数据结构,目的是使"关系"或"标记"数据的工作既简单又直观.它旨在成为在Python中进行实际数据分析的高级构建块. 入门介绍 pandas适合于许多不同类型的数据,包括: 具有异构类型列的表格数据,例如SQL表格或Excel数据 有序和无序(不一定是固定频率)时间序列数据.

  • Python使用Pandas对csv文件进行数据处理的方法

    今天接到一个新的任务,要对一个140多M的csv文件进行数据处理,总共有170多万行,尝试了导入本地的MySQL数据库进行查询,结果用Navicat导入直接卡死....估计是XAMPP套装里面全默认配置的MySQL性能不给力,又尝试用R搞一下吧结果发现光加载csv文件就要3分钟左右的时间,相当不给力啊,翻了翻万能的知乎发现了Python下的一个神器包:Pandas(熊猫们?),加载这个140多M的csv文件两秒钟就搞定,后面的分类汇总等操作也都是秒开,太牛逼了!记录一下这次数据处理的过程: 使用

  • python数据处理——对pandas进行数据变频或插值实例

    这里首先要介绍官方文档,对python有了进一步深度的学习的大家们应该会发现,网上不管csdn或者简书上还是什么地方,教程来源基本就是官方文档,所以英语只要还过的去,推荐看官方文档,就算不够好,也可以只看它里面的sample就够了 好了,不说废话,看我的代码: import pandas as pd import numpy as np rng = pd.date_range('20180101', periods=40) ts = pd.Series(np.arange(1,41), inde

  • python数据处理67个pandas函数总结看完就用

    目录 导⼊数据 导出数据 查看数据 数据选取 数据处理 数据分组.排序.透视 数据合并 不管是业务数据分析 ,还是数据建模.数据处理都是及其重要的一个步骤,它对于最终的结果来说,至关重要. 今天,就为大家总结一下 "Pandas数据处理" 几个方面重要的知识,拿来即用,随查随查. 导⼊数据 导出数据 查看数据 数据选取 数据处理 数据分组和排序 数据合并 # 在使用之前,需要导入pandas库 import pandas as pd 导⼊数据 这里我为大家总结7个常见用法. pd.Da

  • Python 中pandas索引切片读取数据缺失数据处理问题

    引入 numpy已经能够帮助我们处理数据,能够结合matplotlib解决我们数据分析的问题,那么pandas学习的目的在什么地方呢? numpy能够帮我们处理处理数值型数据,但是这还不够 很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等 比如:我们通过爬虫获取到了存储在数据库中的数据 比如:之前youtube的例子中除了数值之外还有国家的信息,视频的分类(tag)信息,标题信息等 所以,numpy能够帮助我们处理数值,但是pandas除了处理数值之外(基于numpy),还能够帮助我

  • Python数据处理pandas读写操作IO工具CSV

    目录 前言 1 CSV 和文本文件 1 参数解析 1.1 基础 1.2 列.索引.名称 1.3 常规解析配置 1.4 NA 和缺失数据处理 1.5 日期时间处理 1.6 迭代 1.7 引用.压缩和文件格式 1.8 错误处理 2. 指定数据列的类型 前言 前面我们介绍了 pandas 的基础语法操作,下面我们开始介绍 pandas 的数据读写操作. pandas 的 IO API 是一组顶层的 reader 函数,比如 pandas.read_csv(),会返回一个 pandas 对象. 而相应的

  • python用pandas读写和追加csv文件

    目录 csv文件 一.创建csv文件 二.读写csv文件 1.基础python 2.pandas 三.追加csv文件 1.基础python 2.pandas 总结 csv文件 CSV文件是最常用的一个文件存储方式.逗号分隔值(Common-Separated Values,CSV)文件以纯文本形式存储表格数据(注:分隔字符也可以是其他字符).纯文本说明该文件是一个字符序列,不包含必须像二进制数字那样被解读的数据. CSV文件由任意数目记录组成,记录间以某种换行符分隔:每条记录由若干字段组成,字段

  • Python使用Pandas读写Excel实例解析

    这篇文章主要介绍了Python使用Pandas读写Excel实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pandas是python的一个数据分析包,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具. Pandas提供了大量能使我们快速便捷地处理数据的函数和方法. Pandas官方文档:https://pandas.pydata.org/pandas-docs/stable/ Pandas中文文档:https:/

  • Python之pandas读写文件乱码的解决方法

    python读写文件有时候会出现   'XXX'编码不能打开XXX什么的,用记事本打开要读取的文件,另存为UTF-8编码,然后再用py去读应该可以了.如果还不行,那么尝试使用文件原有的编码方式读取,参考之前的文章 在pandas中读写csv时候通过制定encoding可以有效防止excel打开或者写入中文乱码 data.to_csv(f_out,index=False,encoding='gb2312') 以上这篇Python之pandas读写文件乱码的解决方法就是小编分享给大家的全部内容了,希

  • python基于Pandas读写MySQL数据库

    要实现 pandas 对 mysql 的读写需要三个库 pandas sqlalchemy pymysql 可能有的同学会问,单独用 pymysql 或 sqlalchemy 来读写数据库不香么,为什么要同时用三个库?主要是使用场景不同,个人觉得就大数据处理而言,用 pandas 读写数据库更加便捷. 1.read_sql_query 读取 mysql read_sql_query 或 read_sql 方法传入参数均为 sql 语句,读取数据库后,返回内容是 dateframe 对象.普及一下

  • python使用pandas读写excel文件的方法实例

    目录 引言 读取excel文件 写入文件: 总结 引言 现在本地创建一个excel表,以及两个sheet,具体数据如下: sheet1: sheet2: 读取excel文件 pandas.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None) io:excel文件路径. sheet_name:返回指定的sheet. header:表头,默认值为0.也可以指定多行.当header取值为None

  • python 利用pandas将arff文件转csv文件的方法

    直接贴代码啦: #coding=utf-8 import pandas as pd def arff_to_csv(fpath): #读取arff数据 if fpath.find('.arff') <0: print('the file is nott .arff file') return f = open(fpath) lines = f.readlines() content = [] for l in lines: content.append(l) datas = [] for c i

  • 用Python的pandas框架操作Excel文件中的数据教程

    引言 本文的目的,是向您展示如何使用pandas来执行一些常见的Excel任务.有些例子比较琐碎,但我觉得展示这些简单的东西与那些你可以在其他地方找到的复杂功能同等重要.作为额外的福利,我将会进行一些模糊字符串匹配,以此来展示一些小花样,以及展示pandas是如何利用完整的Python模块系统去做一些在Python中是简单,但在Excel中却很复杂的事情的. 有道理吧?让我们开始吧. 为某行添加求和项 我要介绍的第一项任务是把某几列相加然后添加一个总和栏. 首先我们将excel 数据 导入到pa

  • Windows下Python使用Pandas模块操作Excel文件的教程

    安装Python环境 ANACONDA是一个Python的发行版本,包含了400多个Python最常用的库,其中就包括了数据分析中需要经常使用到的Numpy和Pandas等.更重要的是,不论在哪个平台上,都可以一键安装,自动配置好环境,不需要用户任何的额外操作,非常方便.因此,安装Python环境就只需要到ANACONDA网站上下载安装文件,双击安装即可. ANACONDA官方下载地址:https://www.continuum.io/downloads 安装完成之后,使用windows + r

  • 使用Python对Access读写操作

    学习Python的过程中,我们会遇到Access的读写问题,这时我们可以利用win32.client模块的COM组件访问功能,通过ADODB操作Access的文件. 1.导入模块 import win32com.client 2.建立数据库连接 conn = win32com.client.Dispatch(r"ADODB.Connection") DSN = 'PROVIDER = Microsoft.Jet.OLEDB.4.0;DATA SOURCE = test.mdb' con

随机推荐