Pandas数据分析之数据读写和存储
一、文本格式读写
1.Pandas解析函数
函数 | 描述 |
---|---|
read_csv | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号 |
read_table | 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(‘\t’) |
read_fwf | 读取特定宽列格式数据(没有分隔符) |
read_clipboard | read_table的剪贴板版,读取剪贴板中的数据,将网页转换为表格时很有用 |
read_excel | 从 Excel的XLS 或XLSX文件中读取表格数据 |
read_hdf | 读取 pandas存储的 HDF5 文件 |
read_html | 读取 HTML 文档中的所有表格 |
read_json | 读取 JSON(JavaScript Object Notation)字符串中的数据 |
read_msgpack | MessagePack二进制格式编码的 pandas 数据 |
read_pickle | 读取 Python pickle格式中存储的任意对象 |
read_sas | 读取存储于 SAS 系统自定义存储格式的 SAS 数据集 |
read_sql | 将SQL查询结果(使用 SQL Alchemy)读取为pandas的 DataFrame |
read_stata | 读取 Stata 文件格式的数据集 |
read_feather | 读取 Feather 二进制文件格式 |
2.Pandas解析函数参数
解析函数的参数主要有5种类型:
- 索引:将⼀个或多个列当做返回的DataFrame处理,以及是否从⽂件、⽤户获取列名。
- 类型推断和数据转换:包括⽤户定义值转换和⾃定义的缺失值符号列表等。
- ⽇期时间解析:包括组合功能,包括分散在多个列中的⽇期时间信息组合成结果中的单个列。
- 迭代:⽀持对⼤型⽂件分块迭代。
- 不规整数据问题:跳过⾏、⻚脚、注释或其他次要数据(⽐如由成千上万个逗号隔开的数值数据)。
参数 | 描述 |
---|---|
path | 表示文件系统位置、URL、文件型对象的字符串 |
sep或delimiter | 用于分隔每行字段的字符序列或正则表达式 |
header | 用作列名的行号。默认为0(第一行),如果没有header行则设置为None |
index_col | 用作行索引的列编号或列名。可以是单个名称/数字或由多个名称/数字组成的列表(分层索引) |
names | 用于结果的列名列表,结合header=None使用 |
skiprows | 需要忽略的行数或行号列表,从文件开始处算起(从0开始) |
na_values | 一组用于替换NA的值 |
comment | 在行结尾处分隔注释的字符 |
parse dates | 尝试将数据解析为datetime,默认为False。如果为True,则尝试解析所有列。可以指定一组列号或列名进行解析。如果列表的元素为列表或元组,就会将多个列组合到一起再进行日期解析工作(例如,日期/时间分别位于两个列中) |
keep _date_col | 如果连接多列解析日期,则保持参与连接的列。默认为False。 |
converters | 由列号/列名跟函数之间的映射关系组成的字典。例如{‘foo’: f)会对foo列的所有值应用函数f |
dayfirst | 当解析有歧义的日期时,将其看做国际格式(例如,7/6/2012->June7,2012),默认为False |
date_parser | 用于解析日期的函数 |
nrows | 需要读取的行数(从文件开始处算起) |
iterator | 返回一个TextParser以便逐块读取文件 |
chunksize | 用于选代的文件块的大小 |
skip_footer | 需要忽略的行数(从文件末尾处算起) |
verbose | 打印各种解析器输出信息,比如位于非数值列中缺失值的数量 |
encoding | 用于unicode的文本编码格式。例如,"utf-8"表示用UTF-8编码的文本 |
squeeze | 如果数据经解析后仅含一列,则返回Series |
thousands | 千分位分隔符,如",“或”." |
3.文件读入
(1)HDF5
- HDF5中的HDF指的是分层数据格式(hierarchical data format)。每个HDF5文件都含有一个文件系统式的节点结构,能够存储多个数据集并支持元数据;支持多种压缩模式的即时压缩,更高效的存储重复模式的数据;适用于处理不合适在内存中存储的超大型数据
- HDFStore支持两种存储模式,‘fixed’和’table’。后者通常会更慢,但是支持使用特殊语法进行查询操作
frame = pd.DataFrame({'a': np.random.randn(100)})
store = pd.HDFStore('mydata.h5')
store['obj1'] = frame
store['obj1_col'] = frame['a']
print(store['obj1'])
store.put('obj2', frame, format='table')
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'])
(2)常用函数及应用
df = pd.read_csv('ex1.csv')
df = pd.read_table('ex1.csv', sep=',') #指定分隔符
df = pd.read_table('ex1.csv', sep='\s+') #任意多个空白字符,包括空格、制表符、换页符等
df = pd.read_csv('ex1.csv', header=None) #不包含列名
names = ['a','b','c','d','message']
df = pd.read_csv('ex1.csv', names=names) #指定列名
df = pd.read_csv('ex1.csv', names=names, index_col='message') #指定索引
df = pd.read_csv('ex1.csv', names=names, index_col=['key1', 'key2']) #分层索引
df = pd.read_csv('ex1.csv', names=names, skiprows=[0,2,3]) #跳过指定行
pd.isnull(df) # 判断缺失值
df = pd.read_csv('ex1.csv', na_values=['NULL']) # NA替换值序列
sentinel = {'message':['foo', 'NA'], 'something': ['two']}
pd.read_csv('ex1.csv', na_values=sentinels) # 每列指定不同缺失值标识
import json
result = json.loads(obj)
asjson = json.dumps(result) # python对象转json
data = pd.read_json('example.json') # 将json转为Series或者DataFrame
data.to_json() # Series或者DataFrame转为JSON
frame = pd.read_csv('examples/ex1.csv')
frame.to_pickle('examples/frame_pickle') #二进制序列化,并写入文件
pd.read_pickle('examples/frame_pickle') # 读取文件
xlsx = pd.ExcelFile('examples/ex1.xlsx') #要读取一个文件中的多个表单,创建ExcelFile会更快
all_sheets = pd.read_excel(file_path, sheet_name=None) #读取所有sheet
for sheet_name, df in all_sheets.items():
pass
sheets_to_read = ['Sheet1', 'Sheet3']
df_sheets = pd.read_excel(file_path, sheet_name=sheets_to_read) # 读取特定sheet,可遍历,同上
pd.read_excel(xlsx, 'Sheet1') #读取指定某个sheet
frame.to_excel('examples/ex2.xlsx') # pandas数据写入excel
4.分块读入
适用于大型数据文件
pd.options.display.max_rows = 10 # 设置显示行的数目
pd.read_csv('ex2.csv',nrows=5) # 显示前5列
chunker = pd.read_csv('ex2.csv', chunksize=1000) #指定文件数据块的大小
for item in chunker: # 迭代
pass
4.数据写入
Series也有to_csv方法
data.to_csv('out.csv') #默认逗号分隔
data.to_csv(sys.stdout, sep='|') #打印文本结果,指定分隔符
data.to_csv(sys.stdout, na_rep='NULL') # 缺少值标注
data.to_csv(sys.stdout, index=False, header=False) #去掉行列标签
data.to_csv(sys.stdout, index=False, columns=['a', 'b','c']) #指定子列和顺序
总结
数据分析的第一步,成长的一小步,加油!
注意,文章所有内容均来自于《利用python进行数据分析》原书第二版中文版,如有错误,欢迎指正