Python数据分析NumPy和pandas(十五、pandas 数据加载、存储和文件格式)

大多数时候,我们要处理分析的数据是存储在不同格式的文件中的,有txt、csv、excel、json、xml以及二进制等磁盘文件格式,还有时候是从数据库以及从Web API中交互获取要处理的数据。现在开始学习如何用pandas从以上内容中输入和输出数据。

读取和写入文本格式数据

pandas具有许多函数,用于将表格数据作为DataFrame对象读取。下面列表列出来一些常用的函数,pandas.read_csv 是最常用的方法之一。这一次主要学习从各种格式的文本文件中存取数据,后面还要学习从二进制数据格式文件中存取数据。

以下列表:pandas 中的文本和二进制数据加载函数

函数描述
read_csv从文件、URL 或类似文件的对象加载分隔数据;使用逗号作为默认分隔符
read_fwf以固定宽度的列格式读取数据(即无分隔符)
read_clipboard从剪贴板读取数据的read_csv函数的变体;用于从网页转换表格
read_excel从 Excel XLS 或 XLSX 文件中读取表格数据
read_hdf读取 pandas 写入的 HDF5 文件
read_html读取给定 HTML 文档中找到的所有表格数据
read_json从 JSON 字符串表示形式、文件、URL 或类似文件的对象中读取数据
read_feather读取 Feather 二进制文件格式
read_orc读取 Apache ORC 二进制文件格式
read_parquet读取 Apache Parquet 二进制文件格式
read_pickle读取 pandas 存储的Python pickle 格式对象
read_sas读取SAS 数据集;由 SAS 系统的自定义存储格式之一存储
read_spss读取 SPSS 创建的数据文件
read_sql读取 SQL 查询的结果(使用 SQLAlchemy)
read_sql_table读取整个 SQL 表(使用 SQLAlchemy);等效于使用 read_sql 选择该表中所有内容的查询
read_stata从 Stata 文件格式读取数据集
read_xml从 XML 文件中读取数据表

这些函数旨在将文本数据转换为 DataFrame,我们先大概了解下这些函数的作用机制。这些函数的可选参数可能分为几类:

Indexing(索引):

可以将一个或多个列视为返回的 DataFrame,以及是否从文件中获取列名等。

Type inference and data conversion(类型推断和数据转换):

包括用户自定义的值转换和缺失值标记的自定义列表等。

Date and time parsing(日期和时间解析)

包括组合功能,可以将分布在多个列中的日期和时间信息合并到结果中的单个列中。

Iterating(迭代):

支持迭代非常大的文件(块)。

Unclean data issues(脏数据问题):

跳过行数据,如页脚、注释或类似于用逗号分隔的千位数字数据的其他小内容数据。

由于现实世界中的数据可能非常混乱,因此随着时间的推移,为了处理这些数据,一些数据加载函数(尤其是 pandas.read_csv)已经积累了一长串可选参数。一开始对这些参数不知所措是正常的(pandas.read_csv 大约有 50 个)。在线 pandas 官方文档有许多关于这些参数工作原理的示例,我们可以找到一个足够相似的示例来帮助我们正确的使用参数。

因为有些文件的 column 数据类型不是数据格式的一部分,所以一些函数提供了类型推理功能。这意味着我们不必指定哪些列是数字、整数、布尔值或字符串。另外有一些数据格式(如 HDF5、ORC 和 Parquet)在格式中嵌入了数据类型信息。

对于处理日期和其他自定义类型,我们可能需要应用更多的其他一些处理方法。


下面我将从读取处理一个小的逗号分隔值 的(CSV) 文本文件开始学习,这个文件名是ex1.csv,存储在examples目录中,examples目录与处理它的Python pandas代码存储在相同目录下,ex1.csv的数据内容如下,另外再创建一个ex2.csv文件,这个文件的数据内容跟ex1.csv一样,只是没有标题行。

 

通过pandas.read_csv函数将其读取出来,并打印到vs code控制台(很简单,不要搞错文件的存储目录和文件名)

import numpy as np
import pandas as pddf = pd.read_csv("examples/ex1.csv")
print(df)

jupyter中输出的pandas对象:

abcdmessage
01234hello
15678world
29101112foo

对于没有标题行的文件ex2.csv,读取此文件,可以允许 pandas 分配默认列名称,也可以自己指定名称,如下代码。

import numpy as np
import pandas as pd#pandas默认制定列名
a = pd.read_csv("examples/ex2.csv", header=None)#用names指定列名。
b = pd.read_csv("examples/ex2.csv", names=["a", "b", "c", "d", "message"])#指定 message 列成为返回的 DataFrame 的索引。
#可以指定索引位于第4列,也可以使用 index_col 参数将其命名为 “message”
names = ["a", "b", "c", "d", "message"]
c = pd.read_csv("examples/ex2.csv", names=names, index_col="message")

设置header=None,则read_csv输出(默认分配列名0 1 2 3 4):

01234
01234hello
15678world
29101112foo

用names指定列名输出:

abcdmessage
01234hello
15678world
29101112foo

用names指定列名,同时用index_col指定message为列索引名,输出:

abcd
message
hello1234
world5678
foo9101112

 如果我们想要从多个列中形成分层索引(后面的学习中还会深入学习分层索引),可以传递列号或名称列表。我们创建一个csv_mindex.csv文件,其内容如下图

我们用read_csv读取该文件,并用index_col指定列名称形成分层索引:

import numpy as np
import pandas as pdparsed = pd.read_csv("examples/csv_mindex.csv", index_col=["key1", "key2"])
print(parsed)

 输出结果如下:

value1value2
key1key2
onea12
b34
c56
d78
twoa910
b1112
c1314
d1516

在某些情况下,表格中可能没有固定的分隔符,会使用空格或其他模式来分隔字段。我们来看文本文件ex3.txt中的内容(空格分隔字典),如下图:

 

这个文本文件ex3.txt中的字段由不同数量的空格分隔。在这种情况下,我们可以将正则表达式作为 pandas.read_csv 的分隔符传递。这里可以用正则表达式 \s+ 来表示(windows下要加个转义符\),看如下代码:

import numpy as np
import pandas as pdresult = pd.read_csv("examples/ex3.txt", sep="\\s+")
print(result)

输出:

ABC
aaa-0.264438-1.026059-0.619500
bbb0.9272720.302904-0.032399
ccc-0.264273-0.386314-0.217601
ddd-0.871858-0.3483821.100491

由于列名少一个,因此pandas.read_csv推断在此特殊情况下,第一列应该是 DataFrame 的索引 。

我们再创建一个ex4.csv,第0、2、3行是注释行,其内容如下图:

我们在读取ex4.csv数据的时候需要忽略第0、2、3行注释内容,因此我们可以如下操作:

import numpy as np
import pandas as pdresult = pd.read_csv("examples/ex4.csv", skiprows=[0, 2, 3])
print(result)

 用skiprows参数指定要跳过的行,输出结果如下:

abcdmessage
01234hello
15678world
29101112foo

处理缺失值是文件数据读取过程中一个重要的部分。缺失数据通常是不存在,或是空字符串、或是由某个 sentinel (占位符)。默认情况下,pandas 使用一组常见的 sentinel替代这些缺失数据,例如 NaN 和 NULL 。我们创建一个ex5.csv文件来示例,这个文件的内容如下图:

import numpy as np
import pandas as pdresult = pd.read_csv("examples/ex5.csv")
print(result)

输出:

somethingabcdmessage
0one123.04NaN
1two56NaN8world
2three91011.012foo

pandas 将缺失值输出为 NaN,因此我们在 result 中有两个缺失值NaN。可以用isna函数判断: 

pd.isna(result) 输出:

somethingabcdmessage
0FalseFalseFalseFalseFalseTrue
1FalseFalseFalseTrueFalseFalse
2FalseFalseFalseFalseFalseFalse

我们还以通过传递一个缺失值列表给na_values参数,指定哪些值是缺失值,例如我们将1和NULL指定为缺失值:

import pandas as pdresult = pd.read_csv("examples/ex5.csv", na_values=["NULL",'1'])print(result)

 输出:

somethingabcdmessage
0oneNaN23.04NaN
1two5.06NaN8world
2three9.01011.012foo

其中元素值1以及为null的元素,都用默认值NaN填充了。

 另外,可以用keep_default_na=False设置缺失值进行isna判断时不为True,例如:

import pandas as pdresult2 = pd.read_csv("examples/ex5.csv", keep_default_na=False)
print(result2)
print(result2.isna())result3 = pd.read_csv("examples/ex5.csv", keep_default_na=False, na_values=["NA"])
print(result3)
print(result3.isna())

result2输出:

somethingabcdmessage
0one1234NA
1two568world
2three9101112foo

result2.isna()输出:

somethingabcdmessage
0FalseFalseFalseFalseFalseFalse
1FalseFalseFalseFalseFalseFalse
2FalseFalseFalseFalseFalseFalse

 result3输出:

somethingabcdmessage
0one1234NaN
1two568world
2three9101112foo

result3.isna()输出: 

somethingabcdmessage
0FalseFalseFalseFalseFalseTrue
1FalseFalseFalseFalseFalseFalse
2FalseFalseFalseFalseFalseFalse

 从以上可以看出获取result2和result3数据的差别,大家可以自己琢磨下。

我们还可以为文件中的每一列指定不同的 NA 占位符,例如:

import pandas as pdsentinels = {"message": ["foo", "NA"], "something": ["two"]}
res = pd.read_csv("examples/ex5.csv", na_values=sentinels, keep_default_na=False)
print(res)

输出:

somethingabcdmessage
0one1234NaN
1NaN568world
2three9101112NaN

以下列表是一些 pandas.read_csv 函数常用参数,大家要学习列表中Description中内容,要动手写代码去试用 :


今天先学到这好累,下次学习分段读取文本文件 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CRC校验 生成多项式选取奇次偶次的问题讨论

目录 问题一:为什么CRC校验码不支持偶次校验码? 问题二:如何判断一个生成多项式是否为偶次多项式? 步骤: 示例: 注意: 问题三:CRC32的生成多项式是什么?是偶次还是…

【小程序上传图片封装2024,支持多图,带进度,上传头像】

import config from ./config;// 支持多图,显示进度 export function uploadImages(count 1, sourceType, onLoading null, showProgress false, fileKey file) {return new Promise((resolve, reject) > {wx.chooseMedia({count: count, // 可以选择的图片数…

Mac上面压缩文件出现__MACOSX文件夹问题

问题 最近需要上传前端zip包&#xff0c;但是&#xff0c;mac右键压缩dist目录的时候&#xff0c;能正常压缩。但是解压这个目录的时候出现了__MACOSX文件夹&#xff0c;是真的坑。 解决 zip -r -X <文件名>.zip <需要压缩的目录>例子如下&#xff1a; zip -r …

Chromium HTML5 新的 Input 类型date 对应c++

一、Input 类型: date date 类型允许你从一个日期选择器选择一个日期。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php"…

Docker 常用命令全解析:提升对雷池社区版的使用经验

Docker 常用命令解析 Docker 是一个开源的容器化平台&#xff0c;允许开发者将应用及其依赖打包到一个可移植的容器中。以下是一些常用的 Docker 命令及其解析&#xff0c;帮助您更好地使用 Docker。 1. Docker 基础命令 查看 Docker 版本 docker --version查看 Docker 运行…

python 爬虫 入门 五、抓取图片、视频

目录 一、图片、音频 二、下载视频&#xff1a; 一、图片、音频 抓取图片的手法在上一篇python 爬虫 入门 四、线程&#xff0c;进程&#xff0c;协程-CSDN博客里面其实有&#xff0c;就是文章中的图片部分&#xff0c;在那一篇文章&#xff0c;初始代码的28&#xff0c;29行…

保姆级教程 | 全流程免费:合并多份长宽不同的PDF成相同大小并进行瘦身

背景 由于老板需要&#xff0c;完成不同PDF文件&#xff08;a&#xff0c;b&#xff0c;c....&#xff09;合并&#xff0c;同时要求主文件&#xff08;A&#xff09;小于6M。合并过程中发现各个PDF大小&#xff08;长宽&#xff09;并不相同&#xff0c;造成合并后效果不好也…

如何将 HashiCorp Vault 与 Node.js 集成:安全管理敏感数据

在处理密码、API 密钥或个人用户信息等敏感数据时,安全存储它们至关重要。在源代码中硬编码机密或将其保存在纯文本文件中是一种危险的方法。这就是 HashiCorp Vault 发挥作用的地方。 Vault 是一个用于管理机密(例如凭证、API 密钥和敏感配置)的开源工具。 在本教程中,我将…

Vue3 学习笔记(八)Vue3 语法-Class 与 Style绑定详解

在 Vue.js 中&#xff0c;动态地绑定 CSS 类和样式是一项常见的需求。Vue 提供了几种不同的方法来实现这一点&#xff0c;包括对象语法、数组语法和组件的作用域插槽。 以下是这些方法的详细说明&#xff1a; 一、Class 绑定 1、对象语法 对象语法允许根据表达式的真值动态地切…

java知识管理系统源码(springboot)

项目简介 知识管理系统实现了以下功能&#xff1a; 知识管理系统的主要使用者分为管理员和用户两个角色。管理员功能有个人中心&#xff0c;用户管理&#xff0c;文章分类管理&#xff0c;文章信息管理&#xff0c;资料分类管理&#xff0c;资料下载管理&#xff0c;问答管理…

信捷 PLC C语言 定时器在FC中的使用

传统梯形图的定时器程序写起来简单&#xff0c;本文用C语言写定时器的使用。 定时器在c语言中使用&#xff0c;和普通梯形图中使用的区别之一是既有外部条件&#xff0c;也有内部条件。 1.建全局变量 2.建立FC POU 这个是功能POU程序。 这里的Enable是内部条件 3.调用包含定…

从JDK 17 到 JDK 21:Java 新特性

JDK17 密封类 概念&#xff1a;密封类允许开发者控制哪些类可以继承或实现特定的类或接口。通过这种方式&#xff0c;密封类为类的继承提供了更高的安全性和可维护性。 定义&#xff1a;使用sealed代表该类为密封类&#xff0c;并用permits限制哪些类可以继承。 public sea…

重写(外壳不变)

重写&#xff1a;是子类对父类非静态、非private修饰、非final修饰、非构造方法等的实现过程进行重新编写返回值和形参都不能改变。 重写的好处&#xff1a;子类可以根据需要&#xff0c;定义专属于自己的行为。&#xff08;子类能够根据需要实现父类的方法&#xff09; 方法…

大数据日志处理框架ELK方案

介绍应用场景大数据ELK日志框架安装部署 一&#xff0c;介绍 大数据日志处理框架ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;是一套完整的日志集中处理方案&#xff0c;以下是对其的详细介绍&#xff1a; 一、Elasticsearch&#xff08;ES&#xff09; 基本…

Golang | Leetcode Golang题解之第515题在每个树行中找最大值

题目&#xff1a; 题解&#xff1a; func largestValues(root *TreeNode) (ans []int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {maxVal : math.MinInt32tmp : qq nilfor _, node : range tmp {maxVal max(maxVal, node.Val)if node.Left ! nil {q …

怎么理解ES6 Proxy

Proxy 可以理解成&#xff0c;在目标对象之前架设一层 “拦截”&#xff0c;外界对该对象的访问&#xff0c;都必须先通过这层拦截&#xff0c;因此提供了一种机制&#xff0c;可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理&#xff0c;用在这里表示由它来 “代理…

前端知识串联笔记(更新中...)

1.MVVM MVVM 是指 Model - View - ViewModel&#xff0c;Model 是数据与业务逻辑&#xff0c;View 是视图&#xff0c;ViewModel 用于连接 View 和 Model Model ---> View&#xff1a;将数据转化成所看到的页面&#xff0c;实现的方式&#xff1a;Data Bindings -- 数据绑定…

.NET Core WebApi第6讲:WebApi的前端怎么派人去拿数据?(区别MVC)

一、前端界面小基础 head&#xff1a;引入CSS, 引入JS是写在head里面。 body&#xff1a;眼睛肉眼能看到的用户展示的界面是写在body里面。 二、前端怎么派人去拿数据&#xff1f; 1、MVC&#xff1a;前后端不分离&#xff0c;MVC相比WebApi只是多了一个views的文件夹 &am…

(蓝桥杯C/C++)—— 编程基础

文章目录 一、C基础格式 1.打印hello, world 2.基本数据类型 二、string 1.string简介 2.string的声明和初始化 3.string其他基本操作 (1)获取字符串长度 (2) 拼接字符串( 或 append) (3&#xff09;字符串查找&#xff08;find&#xff09; (4)字符串替换 (5)提取子字符串…

Spring boot 配置文件的加载顺序

Spring Boot 在启动时会扫描以下位置的 application.properties 或者 application.yml 文件作为全局配置文件&#xff1a; –file:./config/–file:./–classpath:/config/–classpath:/以下是按照优先级从高到低的顺序&#xff0c;如下所示&#xff1a; Spring Boot 会全部扫…