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

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

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

# 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'])

-
非固定分隔符去分隔字段的表格处理:
-
空白符或者其他模式来分隔字段,通过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

# 判断元素是否为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)

# 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

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

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

# 读取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⽂件都含有⼀个⽂件系统式的节点结构
- 及时压缩、高效存储重复模式数据
- 分块读写数据;不是数据库

读取Microsoft Excel文件
读取Excel文件有两种方式:
- pandas的ExcelFile类
- pd.read_excel函数
- 扩展包xlrd--->XLS;openyxl--->XLSX

获取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

数据库交互
- 商业场景下数据一般不会放在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

将数据库中的数据传递给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])

关于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)

网友评论