pandas札记9_读取数据及数据库连接

浏览: 1345
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

读取文件

  • 将表格型数据读取为DF对象的函数
  • read_csv:默认分隔符是逗号
  • read_table:默认分隔符是制表符('\t')
  • read_excel:读取Excel文件
  • read_sql:读取SQL数据文件




    image.png

# 查看文件内容window用type
# linuxz中cat命令
!type example1.csv

image.png

# 默认将第一行作为列属性columns
# 索引(行属性index)默认是从0开始
df = pd.read_csv("example1.csv")
df

image.png

重点:自己创建列属性

# 通过header默认列名
# 使用names自定义列名
print(pd.read_csv("example2.csv", header=None))
pd.read_csv("example2.csv", names=["a", "b", "c" ,"d"])

image.png

# index_col参数指定为索引值
names=["a", "b", "c" ,"d", "message"] # 指定行属性
pd.read_csv("example2.csv", names=names, index_col="message") # 指定message为索引
# index_col中传入多个值,列表形式:parsed = pd.read_csv('examples/csv_mindex.csv',index_col=['key1', 'key2'])

image.png

  • 非固定分隔符去分隔字段的表格处理:

  • 空白符或者其他模式来分隔字段,通过seq指定分隔字段

  • 列名比数据行少,read_table将第一列作为DF的索引




    image.png

  • pd.read_csv("example2.csv",skiprows=[0, 2, 4])

  • 打开文件时:跳过索引为0,2,4的行数据


缺失值处理

  • 数据不存在或者为空字符串
  • 数据使用某个标记值表示
  • pandas通过标记值识别,NA或NULL
# 指定分隔符:sep
result = pd.read_csv("example1.csv", sep=",")
result

image.png

# 判断元素是否为NaN
pd.isnull(result)

按块读取文件

  • 读取文件小部分
  • 逐块读取文件进行迭代
# pandas显示更紧些
pd.options.display.max_rows = 15
result = pd.read_csv(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv", encoding="gb18030")
result.head()

result = pd.read_csv(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv",
nrows=6, encoding="gb18030") # 指定读取6行数据
result
# chunksize 按照块读取数据
# get_chunk 读取任意块的大小
chunker = pd.read_csv(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv", encoding="gb18030", chunksize=1000)
tot = pd.Series([])
for piece in chunker:
tot = tot.add(piece['得分'].value_counts(), fill_value=0)

tot = tot.sort_values(ascending=False)

image.png

# to_csv :将数据写入到以逗号分隔的文件中
# 通过type进行显示
result.to_csv(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv", encoding="gb18030")
!type D:\Python\datalearning\PandasLearning\NBA_Data.csv

# 使用其他分隔符,比如|
# 缺失值在输出结果中会被表示为空字符串
import sys
result.to_csv(sys.stdout, sep="|", na_rep="NULL")

# 默认会写出行和列标签,也可以被禁用

# 全部的行和列标签都不显示
result.to_csv(sys.stdout, index=False, columns=False)
# 指定显示部分的列
# result.to_csv(sys.stdout, index=False, columns=["总得分", "失误数"])

# Series的to_csv方法
dates = pd.date_range("1/1/2019", periods=8)
ts = pd.Series(np.arange(8), inde

处理分隔字符

  • 存储在磁盘上的表格型数据都能用pd.read_table进行加载
  • 对于任何单字符分隔符文件,直接用Python内置的csv模块
  • 将文件对象传给csv.reader()
import csv
f = open(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv")
# 处理单字符分隔符文件:文件传给模块
reader = csv.reader(f)
# 迭代为每行产生一个列表数据
for line in reader:
print(line)

# 通过with方式打开文件,读取到多行的列表中
with open(r"D:\Python\datalearning\PandasLearning\NBA_Data.csv") as f:
lines = list(csv.reader(f))

# 标题header取自line[0];其余取自line[1:]剩下全部
header, values = line[0], line[1:]

# dict{}字典构造式,zip(*values)反解压
data_dict = {h:v for h, v in zip(header,zip(*values))}
data_dict

image.png

json数据

  • import json
  • loads():将json格式转换成Python字典形式
  • dumps():将Python对象转成json格式
# json格式数据
obj = """
{"
name": "Wes",
"
places_lived": ["United States", "Spain", "Germany"],
"
pet": null,
"
siblings": [{"name": "Scott", "age": 30, "pets": ["Zeus", "Zuko"]},
{"
name": "Katie", "age": 38,
"
pets": ["Sixes", "Stache", "Cisco"]}]
}
"
""
obj

image.png

如何将json格式数据转成DF数据

  • 先将json转成Python对象格式
  • DF构造器中传入一个字典的列表
  • result['siblings']:取出siblings键中的值
  • columns=['name', 'age', "pets"] :定义列属性

image.png

# 读取json数据
data = pd.read_json(r'D:\\Python\\datalearning\\example.json')
data

# 将pandas数据导出到json格式
print(data.to_json())

# 结果
{"a":{"0":1,"1":4,"2":7},"b":{"0":2,"1":5,"2":8},"c":{"0":3,"1":6,"2":9}}

# 转换成json格式
print(data.to_json(orient='records'))

# 结果
[{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6},{"a":7,"b":8,"c":9}]

二进制数据格式

  • 使用Python内置的模块pickle序列化
  • to_pickle将数据以pickle格式保存到磁盘上
  • pandas内置⽀持两个⼆进制数据格式:HDF5和MessagePack。

HDF5格式

  • 用PyTable\h5py\pandas可以读取
  • HDF5是⼀种存储⼤规模科学数组数据
  • HDF5中的HDF指的是层次型数据格式(hierarchical data format)
  • 每个HDF5⽂件都含有⼀个⽂件系统式的节点结构
  • 及时压缩、高效存储重复模式数据
  • 分块读写数据;不是数据库

image.png

读取Microsoft Excel文件

读取Excel文件有两种方式:

  • pandas的ExcelFile类
  • pd.read_excel函数
  • 扩展包xlrd--->XLS;openyxl--->XLSX

image.png

获取web api

  • 通过requests库直接获取api
  • 发送HTTP请求,获取requests库
import requests
url = 'https://api.github.com/repos/pandas-dev/pandas/issues'
resp = requests.get(url)
data = resp.json()
# print(data)
data[0]["title"]

issues = pd.DataFrame(data, columns=['number', 'title',
'labels', 'state'])
issues

image.png

数据库交互

  • 商业场景下数据一般不会放在Excel中
  • 放在基于SQL的数据库中:MySQL、SQL server、PostgreSQL
  • PYTHON内置的sqlite3驱动器
# connect--->execute--->commit()
import sqlite3
query = """
create table test
(a varchar(20), b varchar(20),
c real, d integer);
"""

con = sqlite3.connect("mydata.sqlite")
con.execute(query)

# 执行excute之后必须commit()才会生效
con.commit()

# 插入数据
data = [('Atlanta', 'Georgia', 1.25, 6),
('Tallahassee', 'Florida', 2.6, 3),
('Sacramento', 'California', 1.7, 5)]

stmt = "INSERT INTO test VALUES(?, ?, ?, ?)"
con.executemany(stmt, data)
con.commit()

cursor = con.execute("select * from test")
rows = cursor.fetchall()
rows

image.png

将数据库中的数据传递给DF中

  • 生成上面的元组列表文件
  • 列名:光标cursor的description属性中
  • 属性是元组形式,取出属性的第一个值
  • 传给DF的属性columns
# 元组形式
cursor.description
# 结果
(('a', None, None, None, None, None, None),
('b', None, None, None, None, None, None),
('c', None, None, None, None, None, None),
('d', None, None, None, None, None, None))

pd.DataFrame(rows, columns=[x[0] for x in cursor.description])

image.png

关于SQLAlchemy

  • 流行的Python SQL工具
  • pandas的read_sql函数允许从SQLAlchemy连接读取数据
  • 导入:import sqlalchemy as sqla
import sqlalchemy as sqla
# 默认是:///
db = sqla.create_engine('sqlite:///mydata.sqlite')
pd.read_sql("select * from test", db)

推荐 0
本文由 皮大大 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册