zoukankan      html  css  js  c++  java
  • Pandas学习(4、数据载入、存储及文件格式

    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

  • 相关阅读:
    (黑马十次方项目day06)@ConfigurationProperties报错的解决方式
    (黑马十次方项目day04)An attempt was made to call a method that does not exist. The attempt was made from the following location:
    (黑马十次方项目day02)使用map接收form表单的参数
    (黑马十次方项目day02)IDEA在方法之间添加分隔符及开启Run Dashboard管理
    (黑马十次方项目day01)spring-boot-starter-parent 包maven依赖报错
    (黑马十次方项目day01)从PDF文件中复制代码到pom文件中project报错
    ER图学习
    java 8 函数式库Vavr功能
    Guava Cache
    UML学习
  • 原文地址:https://www.cnblogs.com/lnd-blog/p/14891942.html
Copyright © 2011-2022 走看看