import pandas as pd import numpy as np '''4.1 文本格式数据的读写''' ''' 表:Pandas的解析函数 函数 描述 read_csv 从文件、URL或文件型对象读取分隔好的数据,逗号是默认分隔符 read_table 从文件、URL或文件型对象读取分隔好的数据,制表符(' ')是默认分隔符 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:UsersAdministratorDesktop报表数据cdma.xls", engine='python', sep=' ') # print(data.columns) '''使用DataFrame的to_csv方法,可以将数据导出为逗号分隔的文件:''' # data.to_csv(r'C:UsersAdministratorDesktopcdma.csv', encoding='gbk') '''其他的分隔符也可以,比如'|' ''' # data.to_csv(r'C:UsersAdministratorDesktopcdma.csv', encoding='gbk', sep='|') '''缺失值在输出时以空字符串出现,如果想要用其他标识值对缺失值进行标注:''' # data.to_csv(r'C:UsersAdministratorDesktopcdma.csv', encoding='gbk', na_rep='NULL') '''如果没有其他选项被指定的话,行和列的标签都会被写入,不过二者也可以被禁止(一般index=False就够了)''' # data.to_csv(r'C:UsersAdministratorDesktopcdma.csv', encoding='gbk', index=False, header=False) '''也可以仅写入列的子集,而且按照你选择的顺序写入:''' # data.to_csv(r'C:UsersAdministratorDesktopcdma.csv', encoding='gbk', index=False, # columns=['统计日期', '发展部门名称', '渠道管理细分', '用户标识', '套餐名称', '销售区局']) '''4.4 使用分隔格式''' '''有些表格的行会出现问题,用read_csv和read_table都无法解决,比如下例''' # data = pd.read_table(r'C:UsersAdministratorDesktop est.csv') # print(data) '''这里获得的结果中,每个元素还带有双引号,这是需要去除的 a,"b","c" 0 1,"2","3" 1 1,"2","3"''' '''对于任何带有单字符分隔符的文件,可以使用Python的内建csv模块''' import csv # f = open(r'C:UsersAdministratorDesktop est.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:UsersAdministratorDesktop est.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 = ' ' delimiter = ',' quotechar = '"' quoting = csv.QUOTE_MINIMAL # reader = csv.reader(f, dialect=my_dialect) '''也可以不必定义子类,直接将csv方言参数传入csv.reader的关键字参数:''' # reader = csv.reader(f, delimiter='|') ''' 表:csv方言选项 参数 描述 delimiter 一个用于分隔字段的字符,默认是',' lineterminator 行终止符,默认是' ', 读取器会忽略行终止符并识别跨平台行终止符 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:UsersAdministratorDesktop报表数据数据说明与匹配公式.xlsx") '''存储在表中的数据可以通过pandas.read_excel读取到DataFrame中:''' # print(pd.read_excel(xlsx, '部门匹配表')) '''如果读取的是含有多个表的文件,生成ExcelFile更快,但也可以更简洁地将文件名传入pandas.read_excel(推荐这种):''' # frame = pd.read_excel(r"C:UsersAdministratorDesktop报表数据数据说明与匹配公式.xlsx", '部门匹配表') # print(frame) '''如需将pandas数据写入到Excel格式中,你必须先生成一个ExcelWriter,然后使用pandas对象的to_excel方法将数据写入:''' # writer = pd.ExcelWriter(r"C:UsersAdministratorDesktopex2.xlsx") # frame.to_excel(writer, '部门匹配表', index=False) # writer.save() '''也可以将文件路径传给to_excel,避免直接调用ExcelWriter''' # frame.to_excel(r"C:UsersAdministratorDesktopex2.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