pandas的数据一般来源于上游的表型数据。
本节目标:掌握pandas的输入和输出
本节内容:各种类型的read方法 本节技术点:输入和输出函数。以及过滤
本节阅读需要(15)min。 本节实操需要(15)min。
- pandas(3)数据的读入和输出
- 前言
- 一、CSV & text files
- 读入
- 输出
- 二、json文件
- 输入
- 输出
- 三、数据库文件
- 链接
- 读入
- 输出
- 四、Excel文件
- xlrd
- 输出
- 五、其他的有用的小操作
- 列名加前缀
- 总结
作为python核心的数据处理载体。pandas必须要有十分包容的数据读入形式。 这是官网的输入输出工具合集。
我们一般只使用其中的常见的几个。
一、CSV & text files 读入csv虽然也是常见的表格数据,但是格式比xls等简单太多了。和普通的文本文件几乎是一致的。 csv后缀的和txt后缀的互换,大部分情况都是一样的
import pandas as pd
from io import StringIO
data = "COL1,COL2,COL3\na,b,1\na,b,2\nc,d,3"
pd.read_csv(StringIO(data))
pd.read_csv(StringIO(data), sep=",",header=None,usecols=lambda x: x.upper() in ["COL1", "COL3"],names=["col1", "col3"])
第一个是数据,可以是文件的位置,也可以是一段buffer里面的值(一个字节流变量) 这里是buffer,还难一点。 sep是分隔符一般是 逗号"," 缩进"\t" 空白"\s+" 当然一般要视具体的情况而定。
delimiter和seq差不多,一般用不到。
header比较重要。是一个整数值。代表了第几行作为列名。我们都知道Excel第一行一般是列名。 所以一般header=0。 如果想要修改或自定义传入列名。header=None,并且names传入一个序列。
usecols用于挑选某些列,我认为有点多余,因为df是可以截取的,除非一开始为了节省内存。 一般是用列名的序号或列表,也可以使用如实例所示的bool列表
这样第一行就会保留
dtype形如{‘a’: np.float64, ‘b’: np.int32} 的字典强行约束每一个列的数据类型。 数据类型比较杂的时候需要加上!!!
skiprows 用于跳过一些不需要的行
pd.read_csv(StringIO(data), skiprows=lambda x: x % 2 != 0)
很多文件前几行是介绍等所以常常需要跳过前几行。注释这个是从header之后开始计算的。
na_values 空值的处理。 很多情况下数据表不是都完全有值的。但是我们处理的时候空值又会很麻烦,所以我们一般会给空值一个默认值。 在dtype给定的情况下,我们可以传入一个对应的列表,规定每个列的空值替换成什么,比如整形为0,字符串为""
更多的参数见官网
输出to_csv
sep : Field delimiter for the output file (default “,”)
na_rep: A string representation of a missing value (default ‘’)
float_format: Format string for floating point numbers
columns: Columns to write (default None)
header: Whether to write out the column names (default True)
index: whether to write row (index) names (default True)
sep一般是逗号或者tab。 header输出列名,一般都是要的。columns自定义输出的列名 index在很多情况下不需要,需要改成False。默认是True。
注意sep不同的分隔符wps和Excel读取效果可能存在小bug。普通文本编辑器当做TXT打开都是没问题的。 所以输出一定要用具体展示的office软件打开查看实际效果。不行就换一下,或者换后缀xls等等,多试试!!!
二、json文件JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
json其实就是字典,关联列表。所以极为通用。
输入
read_json,json的读取是高度自动化的。基本可以直接读入。
pd.read_json("test.json", dtype={"A": "float32", "bools": "int8"},columns=list(range(4)), index=[str(i) for i in range(4))
也就约束一下具体的类型,最多主动的命名一下行和列。
输出dfj = pd.DataFrame(np.random.randn(5, 2), columns=list("AB"))
json = dfj.to_json()
'{"A":{"0":-0.1213062281,"1":0.6957746499,"2":0.9597255933,"3":-0.6199759194,"4":-0.7323393705},"B":{"0":-0.0978826728,"1":0.3417343559,"2":-1.1103361029,"3":0.1497483186,"4":0.6877383895}}'
其实就是从二维机构转换到树形结构。
Orient
dfjo.to_json(orient="columns") # df默认是列方向
dfjo.to_json(orient="index") # 也可以选择行方向,相当于转置后的矩阵
series默认是行方向。
三、数据库文件我们先简单的介绍一下格式,后面写文章具体的实操一下。
链接首先需要连接上数据库这样才能读写。
from sqlalchemy import create_engine
engine = create_engine("postgresql://scott:tiger@localhost:5432/mydatabase")
读入
pd.read_sql(
sa.text("SELECT * FROM data where Col_1=:col1"), engine, params={"col1": "X"}
)
不使通过地址而是通过链接得到的engine作为数据源。
输出data.to_sql("data", engine)
四、Excel文件
Excel的读取就有些坑爹了,有版本问题。。。 所以Excel尽量化繁为简。 The xlwt package for writing old-style .xls excel files is no longer maintained. The xlrd package is now only for reading old-style .xls files. It is strongly encouraged to install openpyxl to read Excel 2007+ (.xlsx) files. Please do not report issues when using xlrd
to read .xlsx
files. This is no longer supported, switch to using openpyxl instead.
pd.read_excel("path_to_file.xls", sheet_name="Sheet1")
一个信息单才是一个表型数据!!! 绝大部分这样写就够用了
pd.read_excel(xls, "Sheet1", index_col=None, na_values=["NA"], parse_dates=["date_strings"])
xlrd
用到了xlrd库,专业处理Excel的。
import xlrd
xlrd_book = xlrd.open_workbook("path_to_file.xls", on_demand=True)
with pd.ExcelFile(xlrd_book) as xls:
df1 = pd.read_excel(xls, "Sheet1")
df2 = pd.read_excel(xls, "Sheet2")
输出
df.to_excel("path_to_file.xlsx", sheet_name="Sheet1")
我们都知道很多Excel是有各种格式和排版的,但是我们不在乎,我们的目标是表型数据以及相关的运算。 排版这东西不是pandas的职责!!! 不要有奇怪的东西,不然这一块bug满天飞。。。
五、其他的有用的小操作提一些输入输出时候的便捷操作。 我会一直更新的!!!
列名加前缀df.columns = [f"pre_{col}" for col in df.columns]
总结
值的注意的是无论读入和输出多么仔细,还是很可能因为上下游的解析工具不同而得到意外的结果。 比如Excel就有很多家的表格软件。在一些复杂的情况下,可能会出现实际效果的差异。 这个时候需要具体的去调整。。。
不过好在绝大部分情况下读入,输出是如此简单,只需要一个文件名就行。
都是存在可以解析时间的参数的,到时候看看函数介绍就行。