Pandas 文件读取和导出
Pandas 文件讀取和導出
更新時間:2020-12-28 00:16:20標簽:pandas?io
說明
Pandas 中文教程修訂中,歡迎加微信 sinbam 提供建議、糾錯、催更。查看更新日志
我們拿到的數據一般是 CSV、Excel 等格式,將文件加載到 Pandas 的 DataFrame 對象,我們就可以用它的方法進行處理了。在處理結束后,我們也需要將文件導出 Excel 等格式,方便查看。
?
本頁介紹最常用的文件格式和最基本的用法,如有必要會專題介紹更加詳細的功能。
功能列表
下邊是我們經常使用的方法:
| binary | Excel | read_excel | to_excel |
| text | CSV | read_csv?read_table | to_csv |
| text | JSON | read_json | to_json |
| text | 網頁表格 HTML | read_html | to_html |
| text | 剪貼板 | read_clipboard | to_clipboard |
| SQL | SQL | read_sql | to_sql |
| text | Markdown | ? | to_markdown |
讀取更多類型文件可查看官網文檔。
其中:
- 讀取函數一般會賦值給一個變量?df,?df = pd.read_<xxx>()
- 輸出函數是將變量自身進行操作并輸出?df.to_<xxx>()
CSV
從 CSV 文件中讀取數據并加載到 DataFrame:
文件
# 文件目錄 pd.read_csv('data.csv') # 如果文件與代碼文件在同目錄下 pd.read_csv('data/my/data.csv') # 指定目錄 pd.read_csv('data/my/my.data') # CSV 文件擴展名不一定是 csv # 使用網址 url pd.read_csv('https://www.gairuo.com/file/data/dataset/GDP-China.csv')# 也可以從 StringIO 中讀取 from io import StringIO data = ('col1,col2,col3\n''a,b,1\n''a,b,2\n''c,d,3') pd.read_csv(StringIO(data))注:csv 文件擴展名不一定是?.csv
指定分隔符號
# 數據分隔轉化是逗號, 如果是其他可以指定 pd.read_csv(data, sep='\t') # 制表符分隔 tab pd.read_table(data) # read_table 默認是制表符分隔 tab列、索引、名稱
# 默認第一行是表頭,可以指定,如果指定列名會被忽略 pd.read_csv(data, header=0) pd.read_csv(data, header=None) # 沒有表頭 pd.read_csv(data, names=['列1', '列2']) # 指定列名列表 # 如沒列名,自動指定一個: 前綴加序數 pd.read_csv(data, prefix='c_', header=None)# 讀取部分列 pd.read_csv(data, usecols=[0,4,3]) # 按索引只讀取指定列,順序無關 pd.read_csv(data, usecols=['列1', '列5']) # 按索引只讀取指定列# 指定列順序,其實是 df 的篩選功能 pd.read_csv(data, usecols=['列1', '列5'])[['列5', '列1']] pd.read_csv(data, index_col=0) # 第幾列是索引 # 以下用 callable 方式可以巧妙指定順序, in 后邊的是我們要的順序 pd.read_csv(data, usecols=lambda x: x.upper() in ['COL3', 'COL1'])數據類型
data = 'https://www.gairuo.com/file/data/dataset/GDP-China.csv' # 指定數據類型 pd.read_csv(data, dtype=np.float64) # 所有數據均為此數據類型 pd.read_csv(data, dtype={'c1':np.float64, 'c2': str}) # 指定字段的類型# 解析日期時間 pd.read_csv(data, parse_dates=True) # 自動解析日期時間格式 pd.read_csv(data, parse_dates=['年份']) # 指定日期時間字段進行解析 # 將 1、4 列合并解析成名為 時間的 時間類型列 pd.read_csv(data, parse_dates={'時間':[1,4]}) # 指定時間解析庫,默認是 dateutil.parser.parser pd.read_csv(data, date_parser=pd.io.date_converters.parse_date_time) date_parser=lambda x: pd.to_datetime(x, utc=True, format=...)更多功能可參考?pandas.read_csv 詳細使用。
導出文件
df.to_csv('done.csv') df.to_csv('data/done.csv') # 可以指定文件目錄路徑 df.to_csv('done.csv', index=False) # 不要索引 # 導出二進制文件句柄(緩沖), 支持編碼和壓縮 pandas 1.2.0 增加 import io buffer = io.BytesIO() df.to_csv(buffer, encoding="utf-8", compression="gzip")Excel 文件
read_excel() 方法可以使用 xlrd Python 模塊(可能需要安裝,下同)讀取 Excel 2003(.xls)文件。 可以使用 xlrd 或 openpyxl 讀取Excel 2007+(.xlsx)文件。 可以使用 pyxlsb 讀取二進制Excel(.xlsb)文件。 to_excel() 實例方法用于將DataFrame 保存到Excel。 大多數用法類似于 csv,包括文件的讀取和保存。
xlsx = pd.ExcelFile('data.xlsx') df = pd.read_excel(xlsx, 'Sheet1') # 讀取 xlsx.parse('sheet1') # 取指定標簽為 DataFrame # Excel 的所有標簽 xlsx.sheet_names # ['sheet1', 'sheet2', 'sheet3', 'sheet4']文件讀取
# Returns a DataFrame pd.read_excel('team.xlsx') # 默認讀取第一個標簽頁 Sheet pd.read_excel('path_to_file.xls', sheet_name='Sheet1') # 指定 Sheet # 從網址 url 讀取 pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx') # !!! 讀取的功能基本與 read_csv 一樣,可參考上文 # 不指定索引,不指定表頭,使用自動行列索引 pd.read_excel('tmp.xlsx', index_col=None, header=None) # 指定列的數據類型 pd.read_excel('tmp.xlsx', index_col=0,dtype={'Name': str, 'Value': float})多個 Sheet 的讀取:
pd.read_excel('path_to_file.xls', sheet_name=['Sheet1', 'Sheet2'])ExcelFile 對象:
# 使用 ExcelFile 保存文件對象 xlsx = pd.ExcelFile('path_to_file.xls') df = pd.read_excel(xlsx, 'Sheet1')# 可以把多個 Sheet 存入 ExcelFile with pd.ExcelFile('path_to_file.xls') as xls:df1 = pd.read_excel(xls, 'Sheet1')df2 = pd.read_excel(xls, 'Sheet2') df = pd.read_excel(xlsx)常用的參數使用與?read_csv?相同。
導出 excel
df.to_excel('path_to_file.xlsx') # 指定 sheet 名, 不要索引 df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', index=False) # 指定索引名,不合并單元格 df.to_excel('path_to_file.xlsx', index_label='label', merge_cells=False) # 將多個 df 分不同 sheet 導入到一個 excel with pd.ExcelWriter('path_to_file.xlsx') as writer:df1.to_excel(writer, sheet_name='Sheet1')df2.to_excel(writer, sheet_name='Sheet2')# 指定操作引擎 df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', engine='xlsxwriter') # By setting the 'engine' in the ExcelWriter constructor. writer = pd.ExcelWriter('path_to_file.xlsx', engine='xlsxwriter') df.to_excel(writer) writer.save()# 設置系統引擎 from pandas import options # noqa: E402 options.io.excel.xlsx.writer = 'xlsxwriter' df.to_excel('path_to_file.xlsx', sheet_name='Sheet1')JSON 格式
Pandas 可以讀取和生成 Json 字符串,Series 或 DataFrame 都可以被轉換。JSON 格式在網絡上非常通用,在寫爬蟲時可以使用極大提高效率,在做可視化時前端的 JS 庫往往需要接受 Json 格式。
讀取 JSON
pd.read_json('data.json') json = '''{"columns":["col 1","col 2"], "index":["row 1","row 2"], "data":[["a","b"],["c","d"]]} ''' pd.read_json(json) pd.read_json(json, orient='split') # json 格式 ''' orient 支持: - 'split' : dict like {index -> [index], columns -> [columns], data -> [values]} - 'records' : list like [{column -> value}, ... , {column -> value}] - 'index' : dict like {index -> {column -> value}} - 'columns' : dict like {column -> {index -> value}} '''輸出 JSON
Series 或 DataFrame 轉換 JSON 的機制如下:
-
Series :
- 默認為 index
- 支持 {split, records, index}
-
DataFrame
- 默認為 columns
- 支持 {split, records, index, columns, values, table}
HTML
read_html() 函數可以接受 HTML字符串 / html文件 / URL,并將HTML表解析為DataFrame。返回的是一個 df 列表,可以通知索引取第幾個。
僅解析網頁內?<table>?標簽里的數據。
dfs = pd.read_html('https://www.gairuo.com/p/pandas-io') dfs[0] # 查看第一個 df # 讀取網頁文件,第一行為表頭 dfs = pd.read_html('data.html', header=0) # 第一列為索引 dfs = pd.read_html(url, index_col=0) # !!! 常用的功能與 read_csv 相同,可參考上文如果一個網頁表格很多,可以指定元素來取得:
# id='table' 的表格,注意這兒仍然可能返回多個 dfs1 = pd.read_html(url, attrs={'id': 'table'}) # dfs1[0] # class='sortable' dfs2 = pd.read_html(url, attrs={'class': 'sortable'})常用的參數使用與?read_csv?相同。
輸出 html
會輸出 html 表格代碼字符串。
print(df.to_html()) print(df.to_html(columns=[0])) # 輸出指定列 print(df.to_html(bold_rows=False)) # 表頭不加粗體 # 表格指定樣式,支持多個 print(df.to_html(classes=['class1', 'class2']))剪貼板 Clipboard
剪貼板(Clipboard)是操作系統級的一個暫存數據的地方,它存在內存中,可以在不同軟件之間傳遞,非常方便。pandas 支持讀取剪貼板中的結構化數據,這就意味著我們不用將數據保存成文件,直接從網頁、文件中復制,然后中直接讀取,非常方便。
讀取剪貼板,它的參數使用與?read_csv?完全一樣:
'''A B C x 1 4 p y 2 5 q z 3 6 r ''' # 復制上邊的數據,然后直接賦值 cdf = pd.read_clipboard()保存到剪貼板:
# 執行完找個地方粘貼一下看看效果 df = pd.DataFrame({'A': [1, 2, 3],'B': [4, 5, 6],'C': ['p', 'q', 'r']},index=['x', 'y', 'z']) df.to_clipboard()SQL
Pandas 支持連接數據庫進行查詢,有以下幾個方法:
- read_sql_table(table_name, con[, schema, …]), 把數據表里的數據轉成 DataFrame
- read_sql_query(sql, con[, index_col, …]), 用 sql 查詢數據到 DataFrame
- read_sql(sql, con[, index_col, …]), 同時支持上邊兩個功能
- DataFrame.to_sql(self, name, con[, schema, …]),把記錄數據寫到數據庫里
輸出 Markdown
Markdown?是一種常用的技術文檔編寫語言,Pandas 支持輸出 Markdown 格式字符串:
print(df.to_markdown()) ''' | | A | B | C | |:---|----:|----:|:----| | x | 1 | 4 | p | | y | 2 | 5 | q | | z | 3 | 6 | r | '''# 不需要索引 print(df.to_markdown(index=False)) # 填充空值 print(df.fillna('').to_markdown(index=False))總結
以上是生活随笔為你收集整理的Pandas 文件读取和导出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iframe父页面与子页面之间的元素获取
- 下一篇: 关注微信公众号使其自动发送欢迎你关注消息