zoukankan      html  css  js  c++  java
  • Pandas一些小技巧

    Pandas有一些不频繁使用容易忘记的小技巧

    1、将不同Dataframe写在一个Excel的不同Sheet,或添加到已有Excel的不同Sheet(同名Sheet会覆盖)

    from pandas import ExcelWriter
    
    #在单个文件中不同df写入对应不同的的工作表
    with ExcelWriter('path_to_file.xlsx') as writer:
        df1.to_excel(writer, sheet_name='Sheet1')
        df2.to_excel(writer, sheet_name='Sheet2')
    
    #附加到已有的Excel文件
    with ExcelWriter('path_to_file.xlsx', mode='a') as writer:
        df.to_excel(writer, sheet_name='Sheet3')

    2、建立索引,修改索引,重建索引,删除索引,索引---->列,列---->索引

    •  建立索引  列---->索引
    import pandas as pd
    
    #DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
      #key:标签或者数组(Series, Index,np.ndarray),复合索引则把标签或数组放在list中
      #drop:删除作为新索引的列
      #append :将列附加到现有的索引
      #inplace :是否修改Dataframe
    
    df = pd.DataFrame({'month': [1, 4, 7, 10],
                       'year': [2012, 2014, 2013, 2014],
                       'sale': [55, 40, 84, 31]})
    #列转索引
    df.set_index('month')
    
    #多列转复合索引
    df.set_index(['year', 'month'])
    
    #设置列与另一索引为复合索引
    df.set_index([pd.Index([1, 2, 3, 4]), 'year'])
    
    #使用Series建立索引
    s = pd.Series([1, 2, 3, 4])
    df.set_index([s, s**2])
    • 重建/删除索引    索引---->列
    #原索引转列,重建递增索引
    df.reset_index()
    
    #删除原索引、重建默认递增索引
    df.reset_index(drop=True)
    
    #行多索引子索引转列多索引的某一层级的列,默认为最高级,若插入其他等级,col_fill为指定最高级索引,若不存在,则创建
    df.reset_index(level='class', col_level=1, col_fill='genus')
    • 修改索引
    import pandas as pd
    import numpy as np
    
    #DataFrame.reindex(labels = None,index = None,columns = None,axis = None,method = None,copy = True,level = None,
                fill_value = nan,limit = None,tolerance = None)
    #reindex相当于对DataFrame的架构(index或者column)筛选或者补充,即如果原df存在相应的 ##索引或列,就保留,没有则为NAN,函数有一系列填充NAN的方法(不止固定填充某值,非操作原始数据NAN)

    index = ['Firefox', 'Chrome', 'Safari', 'IE10', 'Konqueror'] df = pd.DataFrame({ 'http_status': [200,200,404,404,301], 'response_time': [0.04, 0.02, 0.07, 0.08, 1.0]}, index=index) #重新索引行 new_index= ['Safari', 'Iceweasel', 'Comodo Dragon', 'IE10','Chrome'] df.reindex(new_index, fill_value='missing') #重新索引列 df.reindex(columns=['http_status', 'user_agent']) #展示对索引中产生的NAN的填充功能 date_index = pd.date_range('1/1/2010', periods=6, freq='D') df2 = pd.DataFrame({"prices": [100, 101, np.nan, 100, 89, 88]},index=date_index) date_index2 = pd.date_range('12/29/2009', periods=10, freq='D') df2.reindex(date_index2) #第一个有效值以填充之前的NaN值 df2.reindex(date_index2, method='bfill') #.reindex_like #等价于.reindex(index=other.index, columns=other.columns,...)

    3、读取有BOM头的文档(Windows有的软件会在首行添加看不见的BOM头,导致文件处理出错)

    import pandas as pd
    
    df=pd.read_csv("test.csv",sep="	",encoding="utf-8-sig",engine="python")

    #即编码改成有BOM头的即可

    4、在Pandas读取csv的时候报 field larger than field limit (131072) 这样的错误

    •   从报错上来说,这是说字段大小超过限制了,但是一般来说,我们的字段通常是不会超过限制的,如果超过了,就应该反思数据结构是不是适合csv的格式了,所以除了这个,很有可能是解析的方式出了问题,我遇到过一个例子,通过改变Quote行为解决的
    import pandas as pd
    
    df = pd.read_csv('test.csv',sep='	',encoding='utf-8-sig',quoting=3)
    
    #quoting:控制引用字符引用行为,QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3).
    •   但是如果csv的字段就是那么的大,可以使用下述DirtyCode进行拓展限制的处理
    import pandas as pd
    
    maxInt =pd.io.parsers.sys.maxsize
    while True:
        try:
            pd.io.parsers.csv.field_size_limit(maxInt)
            break
        except OverflowError:
        #这里主要是因为Python的Int的大小是远大于C的,当不满足的时候,除以2
            maxInt = maxInt>>1

    5、未完待续... ...

  • 相关阅读:
    PHP 时间转换Unix 时间戳
    PHP中include()与require()的区别
    PHP substr_replace() 函数
    写了个jQuery无缝滚动小插件
    Orchard代码学习笔记 1. 入口
    也作一下装配脑袋的Expression习题
    [转]IIS7.5中神秘的ApplicationPoolIdentity
    Spring.net AOP异常记入单独日志文件
    [源码学习]Razor在VS调试配置
    [备忘]WPF的Colors类
  • 原文地址:https://www.cnblogs.com/shld/p/10580403.html
Copyright © 2011-2022 走看看