常用的數據存儲介質是數據庫和csv文件,pandas模塊包含了相應的API對數據進行輸入和輸出:
- 對於格式化的平面文件:read_table()
- 對於csv文件:read_csv()、to_csv()
- 對於SQL查詢:read_sql、to_sql()
一,平面文件
把按照界定符分割的格式化文件讀取到DataFrame中,使用read_table()函數來實現:
pandas.read_table( filepath_or_buffer: Union[str, pathlib.Path], sep='\t', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, float_precision=None, ...)
重要參數注釋:
- filepath_or_buffer :str,文件的路徑
- sep:str,默認值是'\t',用於分割數據列的界定符。如果分隔符大於一個字符,那么sep參數將會被解釋為正則表達式。
- delimiter:str、默認值是None,是sep的別名
- header:int,默認值是infer(推斷),表示列名所在的數據行的行號。默認值是推斷列名,如果names參數是None,那么推薦header=0,把文件的第一行作為列名;如果顯式傳遞names參數,那么推薦header=None。
- names:array-like,可選,列名的列表,默認值是None。如果文件不包含標題(header)行,應該顯式設置header=None,並在names參數中傳遞數據列。
- index_col :int,str,用於表示作為DataFrame的行標簽的列號或列名,如果設置為False,表示強制DataFrame不把第一列作為索引。
- usecols :list-like,返回列的子集
- squeeze :bool,默認值是False,如果解析的數據只包含一列,那么把數據框轉換為Series
- prefix:str,如果沒有標題,在列號前面添加的前綴
- mangle_dupe_cols:bool,默認值是True,重復的列名X將會被命名為‘X’, ‘X.1’, …’X.N’,如果設置為False,重名的列會被重寫。
- dtype:dict,以字典結構來設置數據列的數據類型,例如,{‘col1’: np.float64, ‘col2’: np.int32, ‘col3’: ‘Int64’}
- engine :用於解析文件的引擎,有效值是c’, ‘python’,C引擎更快,python引擎功能更強。
- converters :dict,key是列號或列標簽,value是用於轉換值(key代表的列值)的函數
- true_values :list,視為True的值
- false_values :list,視為False的值
- skipinitialspace:
- skiprows : 在讀取數據之前跳過的數據行數
- skipfooter :從文件底部跳過的數據行數
- nrows :讀取的數據行數量
- na_values :str、list-like,新增被識別為NA的字符
- keep_default_na :bool,默認值是True,在解析數據時,是否包含默認的NaN值,該行為依賴於參數na_values。
- 當keep_default_na是True,並且指定na_values參數的值,那么把na_values中字符串和NaN解析為NA值。
- 當keep_default_na是True,並且未指定na_values參數的值,那么只把NaN解析為NA值。
- 當keep_default_na是False,並且指定na_values參數的值,那么只把na_values指定的字符串解析為NA值。
- 當keep_default_na是False,並且未指定na_values參數的值,那么沒有字符串會被解析為NA值。
- na_filter :bool,默認值是True,檢測缺失值標記(空字符串和na_values的值)。 在沒有任何NA的數據中,傳遞na_filter = False可以提高讀取大文件的性能。當設置為False時,不檢測數據中的缺失值,此時,參數keep_default_na 和na_values會被忽略。
- verbose:bool,默認值是False,不指示放置在非數字列中的NA值的數量。
- skip_blank_lines :bool,默認值是True,跳過空行,而不是把空行解析為NaN值
- parse_dates :bool,default false,解析日期:
- bool,如果是True,把日期解析為索引
- list of int or names, 列號或列名構成的列表,把列解析為單獨的date 列
- list of list,或者dict,把做個列組合在一起解析為date列
- infer_datetime_format :是否推斷字符串表示的日期格式,默認值是false。如果設置為True,並且啟用parse_dates,那么pandas將會根據列中的字符串來推薦日期/時間的格式
- keep_date_col :bool,default False,如果設置為True,並且parse_dates指定組合多個列作為日期/時間列,那么保留原始列。
- date_parser :用於指定解析日期的函數
- dayfirst :bool,default False,是否把day放在月份前面,例如,DD/MM/YYYY
- cache_dates :bool,default True,如果設置為True,那么使用唯一的轉換日期緩存來應用datetime的轉換。當數據中存在大量重復的日期字符串時,可以大幅度提高解析速度。
- iterator :bool,default False,是否返回TextFileReader對象的迭代器
- chunksize :int,TextFileReader對象的塊大小
- compression :指定文件的壓縮格式,有效值是‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None, default ‘infer’,用於對文件進行解壓縮
- thousands :str,千分隔符
- decimal :str,default '.',識別為小數點的字符
- lineterminator :行分隔符,僅用於C parser
- quotechar :str (length 1),用於表示引用項目的開始和結束的字符。引用的項目可以包括定界符,當界定符包含在引用的項目中時,該界定符被忽略。
- quoting :int 或csv.QUOTE_* 選項, default 0,QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
- doublequote:bool,default True,當指定quotechar且引用不是QUOTE_NONE時,指示是否將一個字段內的兩個連續quotechar元素解釋為單個quotechar元素。
- escapechar :str (length 1),轉義字符
- comment :str,注釋的開始字符,例如,設置comment參數='#',當一行的開頭是#時,則該行是注釋行;當一行中間位置出現#時,該行后續的字符是注釋,不再解析。
- encoding :編碼規則,常用的編碼是utf-8
- float_precision :指定C引擎轉為浮點數的精度,有效值是None、high、round_trip。
二,CSV文件
CSV文件屬於平面文件,大部分參數和read_table是相同的,csv文件中存儲的數據以逗號為字段分隔符,以回車換行為行分隔符,pandas使用read_csv()函數來讀取csv文件,用to_csv()函數把數據存儲為csv。
1,read_csv()函數 用於讀取CSV文件
read_csv()函數的參數非常多,
pandas.read_csv(filepath_or_buffer, sep=', ', delim_whitespace=False, header='infer', names=None, index_col=None, usecols=None,...)
下面主要介紹最常用的參數:
- filepath_or_buffer:文件的路徑
- sep=', ':字段的分隔符,默認值是逗號
- header='infer':字段名稱所在的行號,默認值是infer,表示推斷列名,推斷列名的邏輯是:如果names字段沒有傳遞值,那么header='infer'等價於header=0,從文件的第一行中獲取值作為列名;如果names字段傳遞值,那么header='infer'等價於header=None,使用names參數傳遞的值作為列名。
- names=None:包含列名的列表,列名不能重復。
- index_col=None:索引列的序號,傳遞index_col=False強制pandas不要使用第一列作為索引(row name)
- usecols=None:返回列的子集
2,to_csv()函數用於把數據寫入到CSV文件中
to_csv()函數用於把數據寫入到csv文件中
DataFrame.to_csv(self, path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None, header=True, index=True , index_label=None, mode='w', encoding=None, compression='infer', quoting=None, quotechar='"' , line_terminator=None, chunksize=None, date_format=None, doublequote=True, escapechar=None, decimal='.')
重要參數注釋:
- na_rep:用什么字符來表示缺失值
- float_format:格式化字符串來表示浮點數
- columns:要輸出的列,默認值是None,輸出所有的列
- header:是否輸出列名,默認值是True
- index:是否輸出行索引(row names),默認值是True
- index_label:
- mode:寫模式
- encoding:編碼規則,默認值是utf-8
- compression:壓縮模式:'infer','gzip','bz2','zip','xz',None,如果設置為“infer”和path_or_buf包含“.gz”,“.bz2”,“.zip”或“ .xz”擴展名,那么會自動推斷壓縮模式,否則不壓縮。
- line_terminator:換行符,默認值是os.linesep
- chunksize:一次寫入的行數
- date_format:格式化輸出日期類型
三,SQL查詢
執行SQL查詢,把數據寫入到DataFrame對象中,或者把DataFrame對象中的數據寫入到數據庫中。
1,執行SQL查詢,把數據寫入到DataFrame對象中
read_sql()函數用於執行SQL查詢或Table,read_sql_query()用於執行SQL查詢,read_sql_table()用於查詢Table,把數據寫入到DateFrame對象中:
pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None) pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None) pandas.read_sql_table(table_name, con, schema=None, index_col=None, coerce_float=True, parse_dates=None, columns=None, chunksize=None)
參數注釋:
- sql:SQL查詢
- con:連接,sqlalchemy的engine對象
- index_col:用於指定索引列的名稱,默認值是None
- coerce_float:嘗試把非字符串、非數字類型的值轉換為浮點類型
- parse_dates :list 或dict
- list of column names:把指定的列解析為date
- Dict of
{column_name: format string}:把指定的列按照特定的格式解析為date
- columns:list,從表中select的列
- chunksize:int,如果指定,則返回一個迭代器,chunksize表示每個chunk中包含的行數
2,to_sql()
把數據寫入到數據庫中的表中:
DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, dtype=None, chunksize=None, method=None)
參數注釋:
- name:把數據插入的目的表的名稱
- con:連接,sqlalchemy的engine對象
- schema=None:指定數據庫的架構,例如,mysql
- if_exists='fail':如果關系表存在,當值為fail時,pandas拋出錯誤;當值為replace時,刪除舊表,創建新表;當值為append時,向表中插入新的數據;
- index=True:把DataFrame的索引作為一列,把index_label作為索引列的名稱
- index_label:索引列的名稱,如果設置為None,並且index參數設置為True,那么索引的name屬性作為索引列名。
- dtype:dict,為列指定的數據類型,字典的key是列名,字典的value是數據類型。
- chunksize:批量寫入時每個batch包含色數據行數量,默認情況下,一次性寫入所有的數據行
- method:插入數據的方法,默認值是None,一次插入一行;multi是指一次插入多行數據,
舉個例子,從一個數據庫中查詢數據,插入到SQL Server數據庫中:
import pymssql import pandas as pd from sqlalchemy import create_engine con=psycopg2.connect(dbname= 'db_name', host='db_host', port= '5439', user= '', password= '') engine=create_engine('mssql+pymssql://user:password@host/db_name?charset=utf8',echo=False) sql=""" select ... """ data_frame = pd.read_sql(sql, con) data_frame.to_sql('out_table', con=engine, if_exists='append',index = False, schema='dbo')
參考文檔: