读写文本格式的数据
!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