数据加载、存储与文件格式

读写文本格式的数据

!cat examples/ex1.csv   #逗号分隔的文本文件
df = pd.read_csv('examples/ex1.csv')   #读取该文件,生成一个DataFrame
df
pd.read_table('examples/ex1.csv', sep=',')    #读取文件并选择逗号为分隔符

#以上为有标题行,而对于没有标题行的文件有两种方法
 
 pd.read_csv('examples/ex2.csv', header=None)    #得到的DataFrame有列标题行为01234
pd.read_csv('examples/ex2.csv', names=['a', 'b', 'c', 'd', 'message'])  #用参数name给定标题行名称

将某列作为DataFrame的索引

names = ['a', 'b', 'c', 'd', 'message']
pd.read_csv('examples/ex2.csv', names=names, index_col='message')    #将message列编程DataFrame的索引

将多个列做成一个层次化的索引,只需要传入由列名组成的列表

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

当文本是由不同数量的空格作为间隔时,可以用正则表达式表达为\s+

result = pd.read_table('examples/ex3.txt', sep='\s+')
result
!cat examples/ex4.csv
pd.read_csv('examples/ex4.csv', skiprows=[0, 2, 3])   #跳过文件的第一第三第四行
!cat examples/ex5.csv
result = pd.read_csv('examples/ex5.csv')      #默认把缺失值输出为NAN等
result
pd.isnull(result)  #用true或false判断每一个值是否为缺失值
result = pd.read_csv('examples/ex5.csv', na_values=['NULL']) 
 #na_values可以用一个列表或者集合的字符串表示缺失值
 sentinels = {'message': ['foo', 'NA'], 'something': ['two']}
pd.read_csv('examples/ex5.csv', na_values=sentinels)
#将sentinels对应的数都变成NAN

逐块读取文本文件

pd.read_csv('examples/ex6.csv', nrows=5) #nrow=5表示只读取文件的前五行(不包括列名行)

要逐块读取文件,可以指定chunksize(行数)

chunker = pd.read_csv('examples/ex6.csv', chunksize=1000)

tot = pd.Series([])
for piece in chunker:
    tot = tot.add(piece['key'].value_counts(), fill_value=0)

tot = tot.sort_values(ascending=False)
tot[:10]

将数据写出到文本格式

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

data = pd.read_csv('examples/ex5.csv')
data
data.to_csv('examples/out.csv')   #将数据写入到名为examples/out.csv的文件中,分隔符为逗号,缺失值表示为空字符串
!cat examples/out.csv
import sys
data.to_csv(sys.stdout, sep='|')   #分隔符为|
data.to_csv(sys.stdout, na_rep='NULL')   #缺失值表示为NULL,间隔符默认为逗号
data.to_csv(sys.stdout, index=False, header=False)    #Index和header禁用行和列的标签(名字)
data.to_csv(sys.stdout, index=False, columns=['a', 'b', 'c']) #只写入a,b,c三列,并且该方法可以按照你指定的顺序写入

处理分隔符格式

大部分存储在磁盘上的表格行数据都能用read_table进行加载,然而一些含有畸形行的文件可能出现问题
对于任何单字符分隔符文件,可以直接使用python内置的csv模块

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

reader = csv.reader(f)
for line in reader:
    print(line)
with open('examples/ex7.csv') as f:
    lines = list(csv.reader(f))   #读取文件到一个多行的List中
header, values = lines[0], lines[1:]   #分为标题行和数据行
data_dict = {h: v for h, v in zip(header, zip(*values))}   #用字典构造式和zip(*value)创建数据列的字典
data_dict

csv文件的形式有很多,只需要定义csv.dialect的一个子类即可定义新格式,如

class my_dialect(csv.Dialect):
 lineterminator = '\n' 
 delimiter = ';' 
 quotechar = '"' 
 quoting = csv.QUOTE_MINIMAL

reader = csv.reader(f, dialect=my_dialect)
reader = csv.reader(f, delimiter='|') #参数也可以以关键字的形式提供给csv.reader,不使用子类

对于那些使用复杂分隔符或多字符分隔符的文件,csv模块就无能为力了,需要使用字符串的split方法或正则表达式方法re.split进行行拆分和其他整理工作
csv.writer接受已打开且可写的文件
总结:


import csv
def read(file_location):
    with open(file_location, 'r+', newline='') as csv_file:
        reader = csv.reader(csv_file)
        return [row for row in reader]
 
def write(file_location, rows):
    with open(file_location, 'w+', newline='') as csv_file:
        writer = csv.writer(csv_file)
        for row in rows:
            writer.writerow(row)

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"]}]
}
"""
import json
result = json.loads(obj)
result
asjson = json.dumps(result)  #把python对象转换为json的格式
siblings = pd.DataFrame(result['siblings'], columns=['name', 'age'])  #用上面得到的结果构造一个DataFrame
siblings
data = pd.read_json('filepath')    #还可以添加dtype参数来取定数据格式,当含有中文时要加上encoding参数,赋值utf-8

在基于pandas处理数据时,尤其是通过读取外部数据源来做分析时,一定要注意数据类型的转化问题,避免出现类似这种因为底层数据存储溢出导致数据失真、或者数据类型变化导致的错误【Eg:pd.read_json(),pd.read_csv()】
当需要将数据从pandas输出到JSON,要使用to_json方法

print(data.to_json())
print(data.to_json(orient='records'))

XML和HTML:web信息收集

pandas里有一个内置功能,read_html,它可以使用IXML和beatiful Soup将HTML中的表格解析为DataFrame对象

pip install lxml
pip install beautifulsoup4 html5lib
tables = pd.read_html('examples/fdic_failed_bank_list.html')    #得到的是一个对象的DataFrane对象
failures = tables[0]      #选择第一个表
failures.head()          #显示表格的前五行
close_timestamps = pd.to_datetime(failures['Closing Date'])
close_timestamps.dt.year.value_counts()    #一些数据清洗的操作

利用lxml.objectify解析XML

XML是另⼀种常⻅的⽀持分层、嵌套数据以及元数据的结构化数据格式。


二进制数据格式

pandas中可以用to_pickle方法将数据以Pickle格式保存到磁盘中。


frame = pd.read_csv('examples/ex1.csv')
frame
frame.to_pickle('examples/frame_pickle')    #pickle格式包村
pd.read_pickle('examples/frame_pickle')  #读取pickle格式数据
#pickle格式仅用于短期保存数据,其原因是很难保证格式永远是稳定的

使用HDF5格式

HDF5是⼀种存储⼤规模科学数组数据的⾮常好的⽂件格式。HDF5中的HDF指的是层次型数据格式。对于那些⾮常⼤的⽆法直接放⼊内存的数据集, HDF5就是不错的选择,因为它可以⾼效地分块读写。

frame = pd.DataFrame({'a': np.random.randn(100)})
store = pd.HDFStore('mydata.h5')     #存储到mydata.h5这个filepath中
store['obj1'] = frame   
store['obj1_col'] = frame['a']
store['obj1']    #HDF5中的对象可以通过与字典一样的API进行获取

#HDFStore⽀持两种存储模式, 'fixed'和'table'。后者通常会更
慢,但是⽀持使⽤特殊语法进⾏查询操作:
store.put('obj2', frame, format='table')   #put是store['obj2'] = frame⽅法的显示版本,允许我们设置其它的
选项,⽐如格式
store.select('obj2', where=['index >= 10 and index <= 15'])
store.close()
frame.to_hdf('mydata.h5', 'obj3', format='table')
pd.read_hdf('mydata.h5', 'obj3', where=['index < 5'])   #pandas.read_hdf函数可以快捷使⽤这些⼯具

读取excel文件

xlsx = pd.ExcelFile('examples/ex1.xlsx')
pd.read_excel(xlsx, 'Sheet1')
frame = pd.read_excel('examples/ex1.xlsx', 'Sheet1')
frame
#以上两种方法都可以读取excel,第一种方法在读取一个文件中的多个表单会更快

#将pandas的数据写入到excel文件中
writer = pd.ExcelWriter('examples/ex2.xlsx')
frame.to_excel(writer, 'Sheet1')
writer.save()
frame.to_excel('examples/ex2.xlsx')

将多个带有多个sheets的excel文件写入同一个excel文件中

import pandas as pd
import os
# 将excel中的sheet名称放入列表
sheet_names = ["name1","name2","name3","name4", ... ]
# 将excel文件名称放入列表
xlsx_names = [x for x in os.listdir() if x.endswith(".xlsx")]
writer = pd.ExcelWriter('result.xlsx',engine='openpyxl')  #参数openpyxl是为了避免被覆盖
num = 1
for sheet_name in sheet_names:
    df = None
    for xlsx_name in xlsx_names:
        _df = pd.read_excel(xlsx_name, sheet_name=sheet_name)
        if df is None:
            df = _df
        else:
            df = pd.concat([df, _df], ignore_index=True)
    # 下面的保存文件处填写writer,结果会不断地新增sheet,避免循环时被覆盖
    df.to_excel(excel_writer=writer, sheet_name=sheet_name, encoding="utf-8", index=False)
    print(sheet_name + "  保存成功!共%d个,第%d个。" % (len(sheet_names),num))
    num += 1
writer.save()
writer.close()

web APIs交互

import requests
url = 'https://api.github.com/repos/pandas-dev/pandas/issues'
resp = requests.get(url)
resp
data = resp.json()  #返回一个包含被解析过的JSON字典
issues = pd.DataFrame(data, columns=['number', 'title',
                                     'labels', 'state'])
issues

数据库交互

将数据从SQL加载到DataFrame

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值