Pandas學習記錄

Pandas學習記錄


PandasPython語言中非常好用的一種數據結構包,包含了許多有用的數據操作方法。而且很多算法相關的庫函數的輸入數據結構都要求是pandas數據,或者有該數據的接口。

讀寫數據

仔細看pandas的API說明文檔,就會發現pandas支持很多格式的文件讀寫:

Format Type Data Description Reader Writer
text CSV read_csv to_csv
text JSON read_json to_json
text HTML read_html to_html
text Local clipboard read_clipboard to_clipboard
binary MS Excel read_excel to_excel
binary HDF5 Format read_hdf to_hdf
binary Feather Format read_feather to_feather
binary Parquet Format read_parquet to_parquet
binary Msgpack read_msgpack to_msgpack
binary Stata read_stata to_stata
binary SAS read_sas
binary Python Pickle Format read_pickle to_pickle
SQL SQL read_sql to_sql
SQL Google Big Query read_gbq to_gbq
  1. read_csv
    對最常用的read_csv函數的參數進行詳解
    函數說明:讀取CSV(默認逗號分割)文件到DataFrame
  • 基礎參數
    filepath_or_buffer: str,pathlib.
    任何可用read()的基類都可以,也可以是URL
    sep : str, default ‘,’
    指定分隔符。如果不指定參數,則會嘗試使用逗號分隔。分隔符長於一個字符並且不是‘\s+’,將使用python的語法分析器。並且忽略數據中的逗號。正則表達式例子:’\r\t’
    delimiter : str, default None
    定界符,備選分隔符(如果指定該參數,則sep參數失效)
    delim_whitespace : boolean, default False.
    指定空格(例如’ ‘或者’ ‘)是否作爲分隔符使用,等效於設定sep=’\s+’。如果這個參數設定爲Ture那麼delimiter 參數失效。

  • 列/行索引及其名字
    header : int or list of ints, default ‘infer’
    指定行數用來作爲列名,數據開始行數。如果文件中沒有列名,則默認爲0,否則設置爲None。如果明確設定header=0 就會替換掉原來存在列名。
    header參數可以是一個list例如:[0,1,3],這個list表示將文件中的這些行作爲列標題(意味着每一列有多個標題),介於中間的行將被忽略掉(例如本例中的2;本例中的數據1,2,4行將被作爲多級標題出現,第3行數據將被丟棄,dataframe的數據從第5行開始。)。
    names : array-like, default None
    用於結果的列名列表,如果數據文件中沒有列標題行,就需要執行header=None。默認列表中不能出現重複,除非設定參數mangle_dupe_cols=True。
    nrows : int, default None
    需要讀取的行數(從文件頭開始算起)。
    index_col : int or sequence or False, default None
    用作行索引的列編號或者列名,如果給定一個序列則有多個行索引。
    如果文件不規則,行尾有分隔符,則可以設定index_col=False 來是的pandas不適用第一列作爲行索引。
    prefix : str, default None
    在沒有列標題時,給列添加前綴。例如:添加‘X’ 成爲 X0, X1, …
    mangle_dupe_cols : boolean, default True
    重複的列,將‘X’…’X’表示爲‘X.0’…’X.N’。如果設定爲false則會將所有重名列覆蓋。

  • 解釋器基本配置
    dtype : Type name or dict of column -> type, default None
    每列數據的數據類型。例如 {‘a’: np.float64, ‘b’: np.int32}
    engine : {‘c’, ‘python’}, optional
    使用的分析引擎。可以選擇C或者是python。C引擎快但是Python引擎功能更加完備。
    converters : dict, default None
    列轉換函數的字典。key可以是列名或者列的序號。
    iterator : boolean, default False
    返回一個TextFileReader 對象,以便逐塊處理文件。
    compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
    直接使用磁盤上的壓縮文件。如果使用infer參數,則使用 gzip, bz2, zip或者解壓文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’這些爲後綴的文件,否則不解壓。如果使用zip,那麼ZIP包中必須只包含一個文件。設置爲None則不解壓。
    decimal : str, default ‘.’`
    字符中的小數點 (例如:歐洲數據使用’,‘).

  • 忽略及空缺值
    skipinitialspace : boolean, default False
    忽略分隔符後的空白(默認爲False,即不忽略).
    skiprows : list-like or integer, default None
    需要忽略的行數(從文件開始處算起),或需要跳過的行號列表(從0開始)。
    na_values : scalar, str, list-like, or dict, default None
    一組用於替換NA/NaN的值。如果傳參,需要制定特定列的空值。默認爲‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’.keep_default_na : bool, default True如果指定na_values參數,並且keep_default_na=False,那麼默認的NaN將被覆蓋,否則添加。na_filter : boolean, default True是否檢查丟失值(空字符串或者是空值)。對於大文件來說數據集中沒有空值,設定na_filter=False可以提升讀取速度。kip_blank_lines : boolean, default True `
    如果爲True,則跳過空行;否則記爲NaN。

  • 其他(引號、編碼)
    quotechar : str (length 1), optional
    引號,用作標識開始解釋的字符,引號內的分割符將被忽略。
    quoting : int or csv.QUOTE_* instance, default 0
    控制csv中的引號常量。可選 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
    doublequote : boolean, default True
    雙引號,當單引號已經被定義,並且quoting 參數不是QUOTE_NONE的時候,使用雙引號表示引號內的元素作爲一個元素使用。
    escapechar : str (length 1), default None
    當quoting 爲QUOTE_NONE時,指定一個字符使的不受分隔符限值。
    encoding : str, default None
    指定字符集類型,通常指定爲’utf-8’. List of Python standard encodings
    下使用)。

數據結構

Dimensions Name Description
1 Series 1D labeled
2 DataFrame General 2D labeled

DataFrame

創建

  • 通過字典創建
In [10]: df2 = pd.DataFrame({ 'A' : 1.,
   ....:                      'B' : pd.Timestamp('20130102'),
   ....:                      'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
   ....:                      'D' : np.array([3] * 4,dtype='int32'),
   ....:                      'E' : pd.Categorical(["test","train","test","train"]),
   ....:                      'F' : 'foo' })
   ....: 

In [11]: df2
Out[11]: 
     A          B    C  D      E    F
0  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
2  1.0 2013-01-02  1.0  3   test  foo
3  1.0 2013-01-02  1.0  3  train  foo
  • 通過numpy,並指定列明,索引名創建
In [6]: dates = pd.date_range('20130101', periods=6)

In [7]: dates
Out[7]: 
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D')

In [8]: df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))

In [9]: df
Out[9]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988

查看數據及其相關屬性

df.head(num): 前num行
df.tail(num): 倒數num行
df.index: 索引名
df.columns: 列名
df.values: 數據值

內置操作

  • 轉置:df.T
  • 排序:
    • 按索引排序 df.sort_index(axis=1, ascending=False)
    • 按列數據排序 df.sort_values(by='B')

選擇篩選

  • 通過行索引/列名:df['A']df[0:3]df['20130102':'20130104']
  • 通過label選擇:df.loc
    • df.loc[:,['A','B']]
    • df.loc['20130102':'20130104',['A','B']]
    • df.loc[dates[0],'A'] = df.at[dates[0],'A']
  • 通過定位選擇:df.iloc
    • df.iloc[3]
    • df.iloc[3:5,0:2]
    • df.iloc[[1,2,4],[0,2]]
    • df.iloc[1,1] = df.iat[1,1]
  • 通過布爾值選擇
    • df[df.A > 0] A列中大於0的所有行
    • df[df > 0] df中所有<=0的置爲空缺值
    • df2[df2['E'].isin(['two','four'])]
    In [43]: df2
    Out[43]: 
                       A         B         C         D      E
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632    one
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236    one
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804    two
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860  three
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401   four
    2013-01-06 -0.673690  0.113648 -1.478427  0.524988  three
    
    In [44]: df2[df2['E'].isin(['two','four'])]
    Out[44]: 
                       A         B         C         D     E
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804   two
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401  four
    

修改值

  • df['F'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
  • df.at[dates[0],'A'] = 0
  • df.loc[:,'D'] = np.array([5] * len(df))
  • data = data.loc[:,cols] 交換列順序

DataFrame合併

  • Concat
  • Join
  • Append

apply函數

DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
func:函數指針,可以是lamda函數,自己實現
axis:指定函數的傳入參數,若axis = 1,就會把每一行數據作爲Series進行傳入
args:func函數的參數

import pandas as pd
import datetime   #用來計算日期差的包

def dataInterval(data1,data2):
    d1 = datetime.datetime.strptime(data1, '%Y-%m-%d')
    d2 = datetime.datetime.strptime(data2, '%Y-%m-%d')
    delta = d1 - d2
    return delta.days

def getInterval_new(arrLike,before,after):  #用來計算日期間隔天數的調用的函數
    before = arrLike[before]
    after = arrLike[after]
    days = dataInterval(after.strip(),before.strip())  #注意去掉兩端空白
    return days

if __name__ == '__main__':    
    fileName = "NS_new.xls";
    df = pd.read_excel(fileName) 
    df['TimeInterval'] = df.apply(getInterval_new , 
      axis = 1, args = ('ReceivedTime','PublishedTime'))    #調用方式一
    #下面的調用方式等價於上面的調用方式
    df['TimeInterval'] = df.apply(getInterval_new , 
      axis = 1, **{'before':'ReceivedTime','after':'PublishedTime'})  #調用方式二
    #下面的調用方式等價於上面的調用方式
    df['TimeInterval'] = df.apply(getInterval_new , 
      axis = 1, before='ReceivedTime',after='PublishedTime')  #調用方式三

參考

  1. pandas官網API文檔
  2. Pandas的Apply函數——Pandas中最好用的函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章