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="\t",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='\t',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、未完待續... ...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM