Pandas学习(4、数据载入、存储及文件格式

import pandas as pd
import numpy as np

'''4.1 文本格式数据的读写'''

'''
表:Pandas的解析函数
函数             描述
read_csv        从文件、URL或文件型对象读取分隔好的数据,逗号是默认分隔符
read_table      从文件、URL或文件型对象读取分隔好的数据,制表符('\t')是默认分隔符
read_fwf        从特定宽度格式的文件中读取数据(无分隔符)
read_clipboard  read_table的剪贴板版本,在将表格从Web页面上转换成数据时有用
read_excel      从Excel的XLS或XLSX文件中读取表格数据
read_hdf        读取用pandas存储的HDF5文件
read_html       从HTML文件中读取所有表格数据
read_json       从JSON(JavaScript Object Notation)字符串中读取数据
read_msgpack    读取以Python pickle格式存储的任意对象
read_sas        读取存储在SAS系统中定制存储格式的SAS数据集
read_sql        将SQL查询的结果(使用SQLAlchemy)读取为pandas的DataFrame
read_stata      读取Stata格式的数据集
read_feather    读取Feather二进制格式
'''

'''
表:一些read_csv/read_table函数参数
参数              描述
path            表名文件系统位置的字符串、URL或文件型对象
sep或delimiter  用于分隔每行字段的字符序列或正则表达式
header          用作列名的行号,默认是0(第一行),如果没有列名的话,应该为None
index_col       用作结果中行索引的列号或列名,可以是一个单一的名称/数字,也可以是一个分层索引
names           结果的列名列表,和header=None一起用
skiprows        从文件开头处起,需要跳过的行数或行号列表
na_values       需要用NA替换的值序列
comment         在行结尾处分隔注释的字符
parse_dates     尝试将数据解析为datetime,默认是False。如果为True,将尝试解析所有的列。也可以指定列号或列名列表来进行解析。
                如果列表的元素是元组或列表,将会把多个列组合在一起进行解析(例如日期/时间将拆分为两列)
keep_date_col   如果连接列到解析日期上,保留被连接的列,默认是False
converters      包含列名称映射到函数的字典(例如{'foo':f}会把函数f应用到'foo'列)
dayfirst        解析非明确日期时按照国际格式处理(例如7/6/2012 ->June 7,2012), 默认为False
date_parser     用于解析日期的函数
nrows           从文件开头处读入的行数
iterator        返回一个TextParser对象,用于零散地读入文件(重要!)
chunksize       用于迭代的块大小
skip_footer     忽略文件尾部的行数
verbose         打印各种解析器输出的信息,比如位于非数值列中的缺失值数量
encoding        Unicode文本编码(例如'utf-8'用于表示UTF-8编码的文本)
squeeze         如果解析数据只包含一列,返回一个Series
thousands       千位分隔符(例如',' 或 '.')
engine          引擎(重要!)如果是中文的话,一般engine='python'
'''

'''4.2 分块读入文本文件'''
'''当处理大型文件或找出正确的参数集来正确处理大文件时,可能需要读入文件的一个小片段或者按小块遍历文件。
在尝试大文件之前,我们可以先对pandas的显示设置进行调整,使之更为紧凑:'''
# pd.options.display.max_rows = 10 #即只显式10行

'''如果只想读取一小部分行(避免读取整个文件),可以指明nrows:'''
# print(pd.read_csv(r'D:\My_DATA\酬金\公客行销、合作、商圈、外包厅酬金(1-3月).csv', engine='python', nrows=5))

'''为了分块读入文件,可以指定chunksize作为每一块的行数:'''
# chunker = pd.read_csv(r'D:\My_DATA\酬金\公客行销、合作、商圈、外包厅酬金(1-3月).csv', engine='python', chunksize=1000)

'''read_csv返回的TextParser对象允许你根据chunksize遍历文件。例如,这里可以遍历上述酬金清单,并对'渠道名称'列聚合获得计数值'''
# tot = pd.Series([])
# for piece in chunker:
#     tot = tot.add(piece['渠道名称'].value_counts(), fill_value=0)
# tot = tot.sort_values(ascending=False)
# print(tot)

'''TextParser还具有get_chunk方法,允许你按照任意大小读取数据块'''
# data = pd.read_csv(r'D:\My_DATA\酬金\公客行销、合作、商圈、外包厅酬金(1-3月).csv', engine='python', iterator=True)
# print(data.get_chunk(10))

'''4.3 将数据写入文本格式'''
# data = pd.read_csv(r"C:\Users\Administrator\Desktop\报表\数据\cdma.xls", engine='python', sep='\t')
# print(data.columns)

'''使用DataFrame的to_csv方法,可以将数据导出为逗号分隔的文件:'''
# data.to_csv(r'C:\Users\Administrator\Desktop\cdma.csv', encoding='gbk')

'''其他的分隔符也可以,比如'|' '''
# data.to_csv(r'C:\Users\Administrator\Desktop\cdma.csv', encoding='gbk', sep='|')

'''缺失值在输出时以空字符串出现,如果想要用其他标识值对缺失值进行标注:'''
# data.to_csv(r'C:\Users\Administrator\Desktop\cdma.csv', encoding='gbk', na_rep='NULL')

'''如果没有其他选项被指定的话,行和列的标签都会被写入,不过二者也可以被禁止(一般index=False就够了)'''
# data.to_csv(r'C:\Users\Administrator\Desktop\cdma.csv', encoding='gbk', index=False, header=False)

'''也可以仅写入列的子集,而且按照你选择的顺序写入:'''
# data.to_csv(r'C:\Users\Administrator\Desktop\cdma.csv', encoding='gbk', index=False,
#             columns=['统计日期', '发展部门名称', '渠道管理细分', '用户标识', '套餐名称', '销售区局'])


'''4.4 使用分隔格式'''
'''有些表格的行会出现问题,用read_csv和read_table都无法解决,比如下例'''
# data = pd.read_table(r'C:\Users\Administrator\Desktop\test.csv')
# print(data)
'''这里获得的结果中,每个元素还带有双引号,这是需要去除的
   a,"b","c"
0  1,"2","3"
1  1,"2","3"'''

'''对于任何带有单字符分隔符的文件,可以使用Python的内建csv模块'''
import csv
# f = open(r'C:\Users\Administrator\Desktop\test.csv')
# reader = csv.reader(f)
'''像遍历文件那样遍历reader会产生元组,元组的值为删除了引号的字符:'''
# for line in reader:
#     print(line)
'''
['a', 'b', 'c']
['1', '2', '3']
['1', '2', '3']'''

'''接下来就可以做一些必要处理,以数据整理为你需要的形式。首先将文件读取为行的列表:'''
# with open(r'C:\Users\Administrator\Desktop\test.csv') as f:
#     lines = list(csv.reader(f))
'''然后,将数据拆分为列名行和数据行:'''
# header, values = lines[0], lines[1:]
'''再然后,使用字典推导式和表达式zip(*values)生成一个包含数据列的字典,字典中行转置成列:'''
# data_dict = {h: v for h, v in zip(header, zip(*values))}
# print(data_dict)
'''{'a': ('1', '1'), 'b': ('2', '2'), 'c': ('3', '3')}'''

'''csv文件有多种不同风格。如需根据不同的分隔符、字符串引用约定或行终止符定义一种新的格式时,我们可以使用csv.Dialect定义一个简单的子类:'''
class my_dialect(csv.Dialect):
    lineterminator = '\n'
    delimiter = ','
    quotechar = '"'
    quoting = csv.QUOTE_MINIMAL

# reader = csv.reader(f, dialect=my_dialect)
'''也可以不必定义子类,直接将csv方言参数传入csv.reader的关键字参数:'''
# reader = csv.reader(f, delimiter='|')

'''
表:csv方言选项
参数            描述
delimiter       一个用于分隔字段的字符,默认是','
lineterminator  行终止符,默认是'\r\n', 读取器会忽略行终止符并识别跨平台行终止符
quotechar       用在含有特殊字符字段中的引号,默认是' " '
quoting         引用惯例。选项包括csv.QUOTE_ALL(引用所有的字段), csv.QUOTE_MINIMAL(默认,只使用特殊字符,如分隔符),
                csv.QUOTE_NONNUMERIC和csv.QUOTE_NONE(不引用)
skipinitialspace 忽略每个分隔符后的空白,默认是False
doublequote     如何处理字段内部的引号。如果为True,则是双引号
escapechar      当引用设置为csv.QUOTE_NONE时用于转义分隔符的字符串,默认是禁用的
'''

'''注:对于具有更复杂或固定的多字符分隔符的文件,你将无法使用csv模块。
在此类情况下,你将不得不使用字符串的split方法或正则表达式方法re.split进行行拆分和其他清理工作。'''

'''需要手动写入被分隔的文件时,你可以使用csv.writer。这个函数接收一个已经打开的可写入文件对象以及和csv.reader相同的csv方言、格式选项:'''
# with open('mydata.csv', 'w') as f:
#     writer = csv.writer(f, dialect=my_dialect)
#     writer.writerow(('one', 'two', 'three'))
#     writer.writerow(('1', '2', '3'))
#     writer.writerow(('4', '5', '6'))
#     writer.writerow(('7', '8', '9'))


'''4.5 JSON数据'''
'''JSON(JaveScript Object Notation的简写)已经成为Web浏览器和其他应用间通过HTTP请求发送数据的标准格式。它是一种比CSV等表格文本形式更为自由的数据形式。'''
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"]}]
}
"""
'''JSON非常接近有效的Python代码,除了它的空值null和一些其他的细微差别(例如不允许列表末尾的逗号)之外。基本类型是对象(字典)、数组(列表)、字符串、数字、布尔值和空值。对象中的所有键都必须是字符串。有几个Python库用于读写JSON数据。我将在这里使用json,因为它是内置在Python标准库中的。将JSON字符串转换为Python形式时,使用json.loads方法:'''
import json
# result = json.loads(obj)
# print(result)
'''另一方面,json.dumps可以将Python对象转换回JSON:'''
# asjson = json.dumps(result)
# print(asjson)
'''你将自行决定如何将JSON对象或对象列表转换为DataFrame或其他数据结构。比如方便的方式是将字典构成的列表(之前是JSON对象)传入DataFrame构造函数,并选出数据字段的子集:'''
# siblings = pd.DataFrame(result['siblings'], columns=['name', 'age'])
# print(siblings)
'''pandas.read_json可以自动将JSON数据集按照指定次序转换为Series或DataFrame。
pandas.read_json的默认选项是假设JSON数组中的每个对象是表里的一行:'''
# data = pd.read_json('examples/example.json')
'''如果需要从pandas中将数据导出为JSON,可以使用to_json方法:'''
# print(siblings.to_json())
#{"name":{"0":"Scott","1":"Katie"},"age":{"0":30,"1":38}}
# print(siblings.to_json(orient='records'))
#[{"name":"Scott","age":30},{"name":"Katie","age":38}]


'''4.6 读取Excel文件'''
'''pandas也支持通过ExcelFile或pandas.read_excel函数来读取存储在Excel2003(或更高版本)文件中的表格型数据。
这些工具内部是使用附加包xlrd和openpyxl来分别读取XLS和XLSX文件的。所以使用前需要先安装这两个包'''

'''使用ExcelFile时,通过将xls或xlsx的路径传入,生成一个实例:'''
# xlsx = pd.ExcelFile(r"C:\Users\Administrator\Desktop\报表\数据\数据说明与匹配公式.xlsx")
'''存储在表中的数据可以通过pandas.read_excel读取到DataFrame中:'''
# print(pd.read_excel(xlsx, '部门匹配表'))

'''如果读取的是含有多个表的文件,生成ExcelFile更快,但也可以更简洁地将文件名传入pandas.read_excel(推荐这种):'''
# frame = pd.read_excel(r"C:\Users\Administrator\Desktop\报表\数据\数据说明与匹配公式.xlsx", '部门匹配表')
# print(frame)

'''如需将pandas数据写入到Excel格式中,你必须先生成一个ExcelWriter,然后使用pandas对象的to_excel方法将数据写入:'''
# writer = pd.ExcelWriter(r"C:\Users\Administrator\Desktop\ex2.xlsx")
# frame.to_excel(writer, '部门匹配表', index=False)
# writer.save()

'''也可以将文件路径传给to_excel,避免直接调用ExcelWriter'''
# frame.to_excel(r"C:\Users\Administrator\Desktop\ex2.xlsx", index=False)

'''4.7 与数据库交互'''
'''当从数据库的表中选择数据时,pymysql返回的是元组'''
import pymysql
# db = pymysql.connect(host='localhost', user='root', password='', port=3306, db='cyber')
# cur = db.cursor() #使用cursor()方法获取操作游标
# sql = 'select * from 部门匹配表'
# cur.execute(sql) # 执行sql语句
# data = list(cur.fetchall()) #如果只取第一条用cur.fetchone()
# print(data) #获取查询的记录

'''可以将元组的列表传给DataFrame构造函数,但还需要包含在游标的description属性中的列名:'''
# print(cur.description)
'''(('合并', 253, None, 1020, 1020, 0, False), ('发展部门名称', 253, None, 1020, 1020, 0, True), ('渠道管理细分', 253, None, 1020, 1020, 0, True), ('所属部门', 253, None, 1020, 1020, 0, True), ('所属分局', 253, None, 1020, 1020, 0, True), ('所属代理商', 253, None, 1020, 1020, 0, True))
'''
# columns = [x[0] for x in cur.description]
# print(columns) #['合并', '发展部门名称', '渠道管理细分', '所属部门', '所属分局', '所属代理商']
# print(pd.DataFrame(data, columns=[x[0] for x in cur.description]))

'''SQLAlchemy项目是一个流行的Python SQL工具包,抽象去除了SQL数据库之间的许多常见差异。pandas有一个read_sql函数允许你从通用的SQLAlchemy连接中轻松地读取数据
sqla.create_engine(mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>])'''
import sqlalchemy as sqla
db = sqla.create_engine('mysql+pymysql://root:@localhost/cyber')
print(pd.read_sql('select * from 部门匹配表', db))

参考于:https://blog.csdn.net/weixin_42029733/article/details/89381807

posted @ 2021-06-17 09:00  拷贝达人  阅读(499)  评论(0编辑  收藏  举报