• pandas之数据存储


    pandas对象修改试图模式和副本模式
    视图模式:多个变量指向同一个内存

    1. 修改一个变量另外一个变量也会改变
    2. 操作如:将一个对象整体赋值给另外一个变量

    副本模式

    1. 修改一个变量,另外一个变量不会变
    2. 操作如:将一个对象查询的一部分赋值给另外一个变量

    当一个对象整体赋值给另一个变量时,视图模式,2个变量对应的内存地址相同,修改一个变量,另外一个变量也会改变
    当使用copy将一个变量赋值给另外一个变量

    1. 或者使用查询赋值,查询数据的一部分并赋值给其他 变量
    2. 当赋值为原数查询一部分时,是副本模式,修改一个变量不会影响另外一个变量
    a_values = [
        [ "张秀英", 0, 82,171, 66,"阜新市",73],
        ["毛桂英", 1, 18, 173, 56,"金华市",70],
        [ "邵涛", 1,15, 163, 58, "滨州市",88],
        ["傅丽",1, 68,185,50,"秦皇岛市",81],
        ["宋秀兰",0,86,182, 79,"乌海市",68]
    ]
    a = pd.DataFrame(a_values,index=[1,2,3,4,5],columns=['name','sex','age','heigh','weight','address','grade'])
    
    #视图模式 修改单元格内的值,a赋值给b时候,a,b同时指向一个地址,节省内存
    b = a
    b.loc[1, 'name'] = 'bobby'  # id(a) == id(b)
    
    # 副本模式,方法分为2种
    #使用copy赋值;最好使用copy副本模式赋值
    c = a.copy()
    c.loc[1,'name'] = 'caruso'
    #查询数据的一部分赋值
    d = a[['name','sex','address']]  # d = a[['name','sex','address']].copy() 优先使用这种方式
    d.loc[1, 'name'] = 'drose'
    

    链式调用:尽量避免链式调用方式修改,容易出错
      整体调用一次执行
      a.loc[0,'name']
    链式调用分开执行,影响效率;更改数据时候,轻度报警高,重度就是不成功
      a['name'][0]
      a.loc[0]['name']

      

    pandas数据存储,数据的输入输出是基本操作
    pandas可以存取多种介质类型数据
    文本类数据

    • csv
    • json

    二进制数据 (电脑上所有的数据都是2进制数据,高级显示利用编码显示)

    • excel
    • pkl
    • hdf5

    数据库

    • sql

    web api数据

    • html

    其他

    • 内存

    文本类数据文件读入pandas是会自动推断每列数据类型并转化
    二进制类数据文件会在格式种存储数据类型
    对pandas不能支持活不方便使用的数据格式,可以使用支持软件将其转化为csv或xlsx个时候使用pandas读写,如spss文件

    csv comma-separated values逗号分隔以纯文本存储表数据的一种格式
    二维表格数据结构,精简省空间,用于数据分析
    json是多维数据格式,浪费空间,用于传输数据api

    • name,age,address,grade
    • liu,19,beijing,60
    • liu,19,'beijing,chaoyang',60

    写入csv

    • 默认utf-8模式
    • 保存其他格式可以自行设置参数encoding
    • 注意:execl打开utf-8的csv文件,中文会乱码,建议保存gbk

    读取csv

    • 注意文本文件编码格式
    • utf-8默认支持
    • 其他编码,需要手动设置参数encoding
    • 注意utf-8格式的csv文件,excel读取时中文会乱码
    pd.read_csv('test.csv',
                encoding='gb2312',
                sep=',',              #指定分隔符,csv默认是逗号,如果是table表格数据一般为	 
                #列索引
    #             header=0,            #默认将第一行设置为表头,其他行也可以
    #             header=None,        # 不将第一行设为索引,列索引
    #             header=[0,1,2],     #层次化索引
    #             names=['姓名','性别','年龄','身高','体重','地址','成绩'],     #配合header=0,自定义索引
                #行索引
    #              index_col=None,                          #行索引,默认值none,不使用数据列,而是使用系统自带索引
    #              index_col=0,                            #把第0行作为列索引
    #              index_col='name',                      #name作为列索引
    #              index_col=[0,1,2],                   #默认索引,多列层次化索引
    #              index_col=['name','age'],          #自定义索引多列
                #读取行列
    #             usecols=[0,2,4],                        # 读取指定列,默认索引
    #             usecols=['name','address'],             #读取指定列,自定义索引
    #             nrows=3,                                  #读取前几行
    #             skiprows=3,                             #从表格开始算起忽略的行
    #             skiprows=[2,4],                         #跳过2,4行
    #             skipfooter=2,                          #从表格末尾忽略的行,必须配合engine=‘python’否则会报警
    #             engine='python',                       #引擎c更快,python更完善
                # 替换空间
    #             na_values=["乌海市"],                    # 将csv种某些字符替换成空值nan
    #             keep_default_na=True,             # 默认True,同时使用系统自带的空值替换和自定义空值,如na,n/a False只使用自定义空值
    #             encoding='utf-8',                  #默认utf-8, 引擎是python时候需要手动设置
        )
    
    a_values = [
        [ "张秀英", 0, 82,171, 66,"阜新市",73],
        ["毛桂英", 1, 18, 173, 56,"金华市",70],
        [ "邵涛", 1,15, 163, 58, "滨州市",88],
        ["傅丽",1, 68,185,50,"秦皇岛市",81],
        ["宋秀兰",0,86,182, 79,"乌海市",68]
    ]
    a = pd.DataFrame(a_values,index=[1,2,3,4,5],columns=['name','sex','age','heigh','weight','address','grade'])
    
    # 写入
    a.to_csv('test1.csv',encoding='gbk')
    a.to_csv('test2.csv',encoding='gbk',index=False) # 不保存行索引 header=False 不保存列索引不推荐
    a.to_csv('test1.csv',encoding='gbk',columns=['name','age','grade']) # 保存指定的列
    
    parse_dates =[‘index_name’]  # 指定某列位时间序列格式
    

      

    层次化索引查询

    df = pd.read_csv('test.csv',header=[0,1,2],encoding='gbk')
    df['name']['张秀英']['毛桂英'][0]
    df = pd.read_csv('test.csv',index_col=[0,1,2],encoding='gbk')
    df.loc[['张秀英']].loc['张秀英'].loc[0].loc[82]['address']
    

    合并时间列及自定义某列为行索引,多用于时间序列,金融数据分析
    参数 parse_dates

    • 尝试将数据解析为日期
    • 可以使用列表指定需要解析的一组列名,如果列表元素为字典包含的列表或者元组,会将多个列组合到一起在解析日期解析(日期和时间在2个列情况)

    参数 keep_date_col

    • 如果连接多列解析日期,保存参与连接的列,默认False

    数据
    data,time,time2,name,age
    20100101, 000000, 00:00:00, '张三', 18
    20100101, 230000, 23:00:00, '李三', 28

    # 时间序列
    t = pd.read_csv('test3.csv',parse_dates=['date','time','time2'])
    t = pd.read_csv('test3.csv',parse_dates={'s':['date','time2']},keep_date_col=True)
    t = pd.read_csv('test3.csv',parse_dates={'s':['date','time2']},keep_date_col=True,index_col='s')
    

      

    pandas读取excel  .xsls  

    df = pd.DataFrame(np.random.randn(1000,4),columns=['a','b','c','d'])
    df.to_excel('test.xlsx')  # 默认存储到sheet1
    df.to_excel('test.xlsx',sheet_name='abc')  # 存储到abc
    
    # 将多个变量写入同一个excel表格中
    # 创建表格
    writer = pd.ExcelWriter('output.xlsx')
    # 插入一个表格
    a.to_excel(writer,'abc')
    df.to_excel(writer,'sheet1',index=None,header=None)
    # 写入
    writer.save()
    
    # 读取
    pd.read_excel('output.xlsx','sheet1').head()  #读取指定的单元表
    pd.read_excel('output.xlsx',None)  #读取所有的单元表,返回字典
    

      

    json : javascript object notation 是通过http请求在web浏览器和其他应用程序之间发送数据的标准格式之一
    json和csv比较
    json是多维数据,csv是2维数据
    json数据比较冗余,体积大,csv精简,体积小
    json多用于web数据交互,csv多用于数据领域不同环境切换的数据交互
    如果json数据格式超过2维,转为dataFrame后,只能将0/1转为表格,其他维度会议python字典格式存入单元格

    a.to_json('test.json')
    pd.read_json('test.json')
    

      

    使用hdf5格式
    科学领域大数据存储的同行标准,如天文地理

    frame = pd.DataFrame({'a':np.random.randn(100)})
    # 存储,默认fixed, format='table'文件大了很多
    frame.to_hdf('test.hdf5','obj1')
    # 读取
    x = pd.read_hdf('test.hdf5')  #文件只存储一个变量,如果有多个变量读取出错
    x = pd.read_hdf('test.hdf5','obj1')  #指定变量命输出
    
    frame.to_hdf('test1.hdf5','obj1',format='table')
    pd.read_hdf('test1.hdf5','obj1',where=['index<5 and index>1'])
    
    # 创建或读取hdf5文件没有就创建,有就读取
    store = pd.HDFStore('test3.h5')
    store['obj1'] = frame
    # put是直接赋值显示版本,可以自定义格式化格式
    store.put('obj2',frame,format='table')
    

      

    xml&html 网页收集

    table = pd.read_html('http://www.stats.gov.cn/tjsj/zxfb/201806/t20180630_1607071.html')  #某些网络下无法抓取
    
    # 复制后直接从内存读取
    # https://cn.investing.com/currencies/usd-cny-historical-data
    pd.read_clipboard(engine='python',header=None) # header去掉表头
    

      

      

      

    本文为原创文章,转载请标明出处
  • 相关阅读:
    Libcurl
    Inno Setup教程
    APICloud平台的融云2.0集成
    关于mysql建立索引 复合索引 索引类型
    linux恢复误删除文件-extundelete
    OpenStack QA
    Android之应用程序怎样调用支付宝接口
    NYOJ 22 素数求和问题
    Mycat(5):聊天消息表数据库按月分表实践,平滑扩展
    opencv对图像进行边缘及角点检測
  • 原文地址:https://www.cnblogs.com/harden13/p/12987359.html
Copyright © 2020-2023  润新知