利用python进行数据分析学习笔记1(数据加载,存储与文件格式)

读写文本格式的数据

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第1张图片

将工作目录下的一个csv文件读入一个DataFrame中

df = pd.read_csv('examples/ex1.csv')

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第2张图片

也可以是哟个read_table方法,并指定分隔符

pd.read_table('examples/ex1.csv',sep=',')

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第3张图片

有些数据文件没有标题行,如果直接读取,会将第一行默认设置为标题行,传入header=None参数可以避免。

pd.read_csv('examples/ex2.csv')    #将第一行设置为标题行
pd.read_csv('examples/ex2.csv',header=None)

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第4张图片

也可以通过name参数手动设定标题行。

pd.read_csv('examples/ex2.csv',names=['a','b','c','d','message'])

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第5张图片

通过index_col参数可以将源数据的某列设置为行索引列。

names = ['a','b','c','d','message']
pd.read_csv('examples/ex2.csv',names=names,index_col = 'message')

将names列表设置为标题行,index_col参数将message列设置为行索引列。

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第6张图片

可以设置多个列为行索引列,做成层次化索引。

parsed = pd.read_csv('examples/csv_mindex.csv',index_col=['key1','key2'])

设置key1和key2两层索引

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第7张图片

有些表格可能不是用固定的分隔符来分隔字段的。

list(open('examples/ex3.txt'))

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第8张图片

上面的文件中的数据使用数量不同的空白字符间隔开的,可以传入一个正则表达式作为分隔符。

result = pd.read_table('examples/ex3.txt',sep='\s+')

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第9张图片

有时数据文件中不一定全都是数据。

比如这个数据文间的0、2、3行都是注释

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第10张图片

通过skiprows参数可以跳过数据文件的指定行。

pd.read_csv('examples/ex4.csv',skiprows=[0,2,3])

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第11张图片

读取的数据文件中可能会存在缺失值。

result = pd.read_csv('examples/ex5.csv')

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第12张图片

使用isnull方法可以返回一个布尔型DataFrame,缺失值会显示为True。

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第13张图片

据说na_values参数可以设置不同的标记值来表示缺失值

result = pd.read_csv('examples/ex5.csv', na_values=['test'])

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第14张图片

实际好像没什么卵用。

将各列的缺失值用不同的NA标记值。

sentinels = {'message': ['foo', 'NA'], 'something': ['two']}
pd.read_csv('examples/ex5.csv', na_values=sentinels)

read_csv/read_table的一些参数介绍。

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第15张图片

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第16张图片


逐块读取文本文件

看大文件之前可以设置最大显示行数为10行。

pd.options.display.max_rows = 10
result = pd.read_csv('examples/ex6.csv')

显示头五行和尾五行。

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第17张图片

read_csv方法中可以设置nrows参数控制读取行数。

pd.read_csv('examples/ex6.csv',nrows=5)    #只读五行

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第18张图片

要逐块读取文件,设置chunksize参数。

chunker = pd.read_csv('examples/ex6.csv',chunksize=1000)    #将10000行的数据文件拆分成10个1000行。
tot = pd.Series([])    #创建一个空Series
for piece in chunker:    #迭代10个数据块
    tot = tot.add(piece['key'].value_counts(),fill_value=0)
#对每个数据块进行分类求和,key列中有字母也有数字,求出它们的数量
tot = tot.sort_values(ascending=False)    #降序排序

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第19张图片

通过sort_index方法可以对索引进行排序

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第20张图片


将数据写出到文本格式

通过to_csv方法,可以将数据写到一个用逗号分隔的文件中。

data = pd.read_csv('examples/ex5.csv')    #读取文件数据
data.to_csv('examples/test.csv')    #将文件数据转存到另外一个文件中

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第21张图片

test = pd.read_csv('examples/test.csv')

默认是逗号分隔,可以选择其他分隔符。


缺失值会用空字符串来表示,可以通过na_rep参数设置为其他标记值。

data.to_csv(sys.stdout,na_rep='test')

设置index和header参数可以不保存行索引或者列索引

data.to_csv(sys.stdout,index=False,header=False)


还可以设置columns参数选择写入部分数据。

data.to_csv(sys.stdout,index=False,columns=['a','b','c'])

Series也有to_csv方法

dates = pd.date_range('1/1/2000',periods=7)    #创建一个日期序列
ts = pd.Series(np.arange(7),index=dates)    #将日期序列作为Series的索引
ts.to_csv('examples/tseries.csv')

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第22张图片


处理分隔符格式

有一个数据文件如下


对任何单字符分隔符文件,可直接用python内置的csv模块,将任意已打开的文件或文件型的对象传给csv.reader

import csv 
f = open('examples/ex7.csv')
reader = csv.reader(f)

打开指定文件,通过csv模块的reader方法将数据读取至一个变量中。

for line in reader:
    print(line)

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第23张图片

为得到一个格式合理的数据,先进行整理

with open('examples/ex7.csv') as f:
    lines = list(csv.reader(f))        #读取文件到一个多行列表

header,values = lines[0],lines[1:]    #分标题行和数据行


构造字典

data_dic = {h:v for h,v in zip(header,zip(*values))}


JSON数据

JSON数据示例

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第24张图片

通过json.loads将str类型的数据转成dict。

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第25张图片

通过json.dumps函数将dict转为str


将JSON对象转为DataFrame最简单的方法是向DataFrame构造器传入一个字典的列表,选取数据字段的子集。

siblings = pd.DataFrame(result['siblings'],columns=['name','age'])

将字典result中的siblings键对应的数据取出,并选择性地只取name和age列数据。


pd.read_json可以自动将json数据转换为Series或DataFrame


源文件是一个含有三个dict的list。

data = pd.read_json('examples/example.json')
利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第26张图片

将数据从pandas输出到JSON,可以用to_json方法


默认返回一个dict的字符串,以列索引为键,值是行索引和数值组成dict。



XML和HTML:Web信息收集

pandas.read_html默认条件下会搜索,解析

标签内的表格数据,结果是一个列表的DataFrame对象。

tables = pd.read_html('examples/fdic_failed_bank_list.html')

只有一个表格。


是列表的形式


通过切片即可转为DataFrame。

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第27张图片

取前五行。

通过pandas.to_datetime()方法可以获取时间

close_timestamps = pd.to_datetime(failures['Closing Date'])

获取DataFrame的Closing Date列的日期,返回一个Series。

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第28张图片

对日期的年进行描述统计

close_timestamps.dt.year.value_counts()

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第29张图片


利用lxml.objectify解析XML

一个xml文件中的一条记录示例

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第30张图片

用lxml.objectify解析xml文件,在用getroot得到xml文件的根节点的引用。

from lxml import objectify
path = 'datasets/mta_perf/Performance_MNR.xml'
parsed = objectify.parse(open(path))
root = parsed.getroot()

root.INDICATOR返回一个用于产生各个INDICATOR的生成器。

data = []
skip_fields = ['PARENT_SEQ','INDICATOR_SEQ','DESIRED_CHANGE','DECIMAL_PLACES']
for elt in root.INDICATOR:
    el_data = {}
    for child in elt.getchildren():
        if child.tag in skip_fields:
            continue
        el_data[child.tag] = child.pyval
    data.append(el_data)

上面代码的意思是迭代每条INDICATOR记录,跳过排除列表中的几个节点,将其他节点信息导入到一个dict中,再汇总到list中。

最后将这组字典转为DataFrame

perf = pd.DataFrame(data)
perf.head()

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第31张图片


二进制数据格式

通过pandas.to_pickle方法,可以将数据以pickle格式保存到磁盘上

frame = pd.read_csv('examples/ex1.csv')    #读取一个数据文件
frame.to_pickle('examples/frame_pickle')    #通过to_pickle保存

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第32张图片

通过pandas.read_pickle可以读取pickle化的数据。

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第33张图片


使用HDF5格式

这是一种存储大规模科学数组数据的文件格式。

frame = pd.DataFrame({'a':np.random.randn(100)})
store = pd.HDFStore('mydata.h5')    #在工作目录下创建一个h5文件存储数据
store['obj1'] = frame    #将新建的DataFrame保存到h5文件中,命名为obj1
store['obj1_col'] = frame['a']

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第34张图片

获取HDF5文件中DataFrame

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第35张图片

HDFStore支持两种存储模式,'fixed'和'table',后者更慢,但支持特殊语法查询。

store.put('obj2',frame,format='table')
store.select('obj2',where=['index >= 10 and index <= 15'])

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第36张图片

通过DataFrame的to_hdf方法可以将DataFrame保存至新建的h5文件中。

通过pd.read_hdf可以读取h5文件的指定DataFrame中的符合某条件的数据。

frame.to_hdf('mydata2.h5','obj3',format='table')
pd.read_hdf('mydata2.h5','obj3',where=['index < 5'])

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第37张图片

HDF5不是数据库,适合一次写多次读的数据集,虽然数据可以任何时候添加到文件中,如果同时发生多个写操作,文件可能被破坏。


读取Microsoft Excel文件

通过pd.ExcelFile方法创建一个实例

xlsx = pd.ExcelFile('examples/ex1.xlsx')

再用read_excel方法读取具体工作表。

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第38张图片

也可以直接将文件路径传到pd.read_excel方法中。

frame = pd.read_excel('examples/ex1.xlsx','Sheet1')

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第39张图片

若要将数据写入Excel中,先用pd.ExcelWriter创建一个实例,再通过DataFrame的to_excel方法将数据写入文件的指定工作表中。

writer = pd.ExcelWriter('examples/ex2.xlsx')
frame.to_excel(writer,'Sheet1')
writer.save()
利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第40张图片

也可以不创建实例,直接将路径传入到to_excel方法中。

frame.to_excel('examples/ex2.xlsx')


Web APIs交互

许多网站有一些通过JSON格式或其他格式提供数据的公共API,可以通过request包来访问。

import requests
url = 'https://api.github.com/repos/pandas-dev/pandas/issues'
resp = requests.get(url)

通过request模块的get方法获取网站返回的信息。

通过返回对象的json方法可以得到一个被解析过的JSON字典。

data = resp.json()    #data的类型是list
data[0]['title']

根据data创建DataFrame

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

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第41张图片


数据库交互

将数据从SQL加载到DataFrame中。

import sqlite3
query = """
CREATE TABLE test1
(a VARCHAR(20), b VARCHAR(20),
 c REAL,        d INTEGER
);"""
con = sqlite3.connect('mydata.sqlite')    #连接到指定数据库
con.execute(query)    #执行SQL语句,此语句用于创建表格
con.commit()    #提交

插入几行数据

data = [('Atlanta', 'Georgia', 1.25, 6),
        ('Tallahassee', 'Florida', 2.6, 3),
        ('Sacramento', 'California', 1.7, 5)]
stmt = "INSERT INTO test1 VALUES(?, ?, ?, ?)"
con.executemany(stmt,data)    #将data中的数据通过stmt的sql语句插入到test1表中

通过sql语句到SQL中选取数据,返回一个元组列表。

cursor = con.execute('select * from test1')    #选择表1中的全部数据
rows = cursor.fetchall()    

cursor.description方法返回一个元组组成的列表。

cursor.description

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第42张图片

可以根据这个结果得到列索引。

根据上面得到的数据和索引,可以从SQL中获取数据创建DataFrame。

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

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第43张图片

通过sqlalchemy模块的create_engine方法可以连接python和数据库,结合pd.read_sql方法,传入查询语句和连接变量可以获取数据。

import sqlalchemy as sqla
db = sqla.create_engine('sqlite:///mydata.sqlite')
pd.read_sql('select * from test1',db)

测试不知道为什么没有数据。

利用python进行数据分析学习笔记1(数据加载,存储与文件格式)_第44张图片


本学习笔记主要内容来自:https://www.jianshu.com/p/ac7bec000dad

你可能感兴趣的:(python)