Python 数据分析三剑客之 Pandas(十):数据读写
CSDN 課程推薦:《邁向數據科學家:帶你玩轉Python數據分析》,講師齊偉,蘇州研途教育科技有限公司CTO,蘇州大學應用統計專業碩士生指導委員會委員;已出版《跟老齊學Python:輕松入門》《跟老齊學Python:Django實戰》、《跟老齊學Python:數據分析》和《Python大學實用教程》暢銷圖書。
Pandas 系列文章:
- Python 數據分析三劍客之 Pandas(一):認識 Pandas 及其 Series、DataFrame 對象
- Python 數據分析三劍客之 Pandas(二):Index 索引對象以及各種索引操作
- Python 數據分析三劍客之 Pandas(三):算術運算與缺失值的處理
- Python 數據分析三劍客之 Pandas(四):函數應用、映射、排序和層級索引
- Python 數據分析三劍客之 Pandas(五):統計計算與統計描述
- Python 數據分析三劍客之 Pandas(六):GroupBy 數據分裂、應用與合并
- Python 數據分析三劍客之 Pandas(七):合并數據集
- Python 數據分析三劍客之 Pandas(八):數據重塑、重復數據處理與數據替換
- Python 數據分析三劍客之 Pandas(九):時間序列
- Python 數據分析三劍客之 Pandas(十):數據讀寫
另有 NumPy、Matplotlib 系列文章已更新完畢,歡迎關注:
- NumPy 系列文章:https://itrhx.blog.csdn.net/category_9780393.html
- Matplotlib 系列文章:https://itrhx.blog.csdn.net/category_9780418.html
推薦學習資料與網站(博主參與部分文檔翻譯):
- NumPy 官方中文網:https://www.numpy.org.cn/
- Pandas 官方中文網:https://www.pypandas.cn/
- Matplotlib 官方中文網:https://www.matplotlib.org.cn/
- NumPy、Matplotlib、Pandas 速查表:https://github.com/TRHX/Python-quick-reference-table
文章目錄
- 【01x00】讀取數據
- 【01x01】簡單示例
- 【01x02】header / names 定制列標簽
- 【01x03】index_col 指定列為行索引
- 【01x04】sep 指定分隔符
- 【01x05】skiprows 忽略行
- 【01x06】na_values 設置缺失值
- 【01x07】nrows / chunksize 行與塊
- 【02x00】寫入數據
- 【02x01】簡單示例
- 【02x02】sep 指定分隔符
- 【02x03】na_rep 替換缺失值
- 【02x04】index / header 行與列標簽
- 【02x05】columns 指定列
這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106963135 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
【01x00】讀取數據
Pandas 提供了一些用于將表格型數據讀取為 DataFrame 對象的函數。常見方法如下:
Pandas 官方對 IO 工具的介紹:https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html
| read_csv | 從文件、URL、文件型對象中加載帶分隔符的數據。默認分隔符為逗號 |
| read_table | 從文件、URL、文件型對象中加載帶分隔符的數據。默認分隔符為制表符('\t') |
| read_fwf | 讀取定寬列格式數據(沒有分隔符) |
| read_clipboard | 讀取剪貼板中的數據,可以看做 read_table 的剪貼板版本。在將網頁轉換為表格時很有用 |
| read_excel | 從 Excel XLS 或 XLSX file 讀取表格數據 |
| read_hdf | 讀取 pandas寫的 HDF5 文件 |
| read_html | 讀取 HTML 文檔中的所有表格 |
| read_json | 讀取 JSON( JavaScript Object Notation)字符串中的數據 |
| read_msgpack | 讀取二進制格式編碼的 pandas 數據(Pandas v1.0.0 中已刪除對 msgpack 的支持,建議使用 pyarrow) |
| read_pickle | 讀取 Python pickle 格式中存儲的任意對象 |
| read_sas | 讀取存儲于 SAS 系統自定義存儲格式的 SAS 數據集 |
| read_sql | (使用 SQLAlchemy)讀取 SQL 查詢結果為 pandas 的 DataFrame |
| read_stata | 讀取 Stata 文件格式的數據集 |
| read_feather | 讀取 Feather 二進制格式文件 |
以下以 read_csv 和 read_table 為例,它們的參數多達 50 多個,具體可參見官方文檔:
read_csv:https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
read_table:https://pandas.pydata.org/docs/reference/api/pandas.read_table.html
常用參數:
| path | 表示文件系統位置、URL、文件型對象的字符串 |
| sep / delimiter | 用于對行中各字段進行拆分的字符序列或正則表達式 |
| header | 用作列名的行號,默認為 0(第一行),如果沒有 header 行就應該設置為 None |
| index_col | 用作行索引的列編號或列名。可以是單個名稱、數字或由多個名稱、數字組成的列表(層次化索引) |
| names | 用于結果的列名列表,結合 header=None |
| skiprows | 需要忽略的行數(從文件開始處算起),或需要跳過的行號列表(從0開始) |
| na_values | 指定一組值,將該組值設置為 NaN(缺失值) |
| comment | 用于將注釋信息從行尾拆分出去的字符(一個或多個) |
| parse_dates | 嘗試將數據解析為日期,默認為 False。如果為 True,則嘗試解析所有列。此外,還可以指定需要解析的一組列號或列名。 如果列表的元素為列表或元組,就會將多個列組合到一起再進行日期解析工作(例如,日期、時間分別位于兩個列中) |
| keep_date_col | 如果連接多列解析日期,則保持參與連接的列。默認為 False |
| converters | 由列號 / 列名跟函數之間的映射關系組成的字典。例如,{'foo': f} 會對 foo 列的所有值應用函數 f |
| dayfirst | 當解析有歧義的日期時,將其看做國際格式(例如,7/6/2012 —> June 7,2012),默認為 Fase |
| date_parser | 用于解析日期的函數 |
| nrows | 需要讀取的行數(從文件開始處算起) |
| iterator | 返回一個 TextParser 以便逐塊讀取文件 |
| chunksize | 文件塊的大小(用于迭代) |
| skip_footer | 需要忽略的行數(從文件末尾處算起) |
| verbose | 打印各種解析器輸出信息,比如“非數值列中缺失值的數量”等 |
| encoding | 用于 unicode 的文本編碼格式。例如,“utf-8” 表示用 UTF-8 編碼的文本 |
| squeeze | 如果數據經解析后僅含一列,則返回 Series |
| thousands | 千分位分隔符,如 , 或 . |
【01x01】簡單示例
首先創建一個 test1.csv 文件:
使用 read_csv 方法將其讀出為一個 DataFrame 對象:
>>> import pandas as pd >>> obj = pd.read_csv(r'C:\Users\TanRe\Desktop\test1.csv') >>> obja b c d message 0 1 2 3 4 hello 1 5 6 7 8 world 2 9 10 11 12 python >>> >>> type(obj) <class 'pandas.core.frame.DataFrame'>前面的 csv 文件是以逗號分隔的,可以使用 read_table 方法并指定分隔符來讀取:
>>> import pandas as pd >>> obj = pd.read_table(r'C:\Users\TanRe\Desktop\test1.csv', sep=',') >>> obja b c d message 0 1 2 3 4 hello 1 5 6 7 8 world 2 9 10 11 12 python【01x02】header / names 定制列標簽
以上示例中第一行為列標簽,如果沒有單獨定義列標簽,使用 read_csv 方法也會默認將第一行當作列標簽:
>>> import pandas as pd >>> obj = pd.read_csv(r'C:\Users\TanRe\Desktop\test2.csv') >>> obj1 2 3 4 hello 0 5 6 7 8 world 1 9 10 11 12 python避免以上情況,可以設置 header=None,Pandas 會為其自動分配列標簽:
>>> import pandas as pd >>> pd.read_csv(r'C:\Users\TanRe\Desktop\test2.csv', header=None)0 1 2 3 4 0 1 2 3 4 hello 1 5 6 7 8 world 2 9 10 11 12 python也可以使用 names 參數自定義列標簽,傳遞的是一個列表:
>>> import pandas as pd >>> pd.read_csv(r'C:\Users\TanRe\Desktop\test2.csv', names=['a', 'b', 'c', 'd', 'message'])a b c d message 0 1 2 3 4 hello 1 5 6 7 8 world 2 9 10 11 12 python【01x03】index_col 指定列為行索引
index_col 參數可以指定某一列作為 DataFrame 的行索引,傳遞的參數是列名稱,在以下示例中,會將列名為 message 的列作為 DataFrame 的行索引:
>>> pd.read_csv(r'C:\Users\TanRe\Desktop\test2.csv', names=['a', 'b', 'c', 'd', 'message'], index_col='message')a b c d message hello 1 2 3 4 world 5 6 7 8 python 9 10 11 12如果需要構造多層索引的 DataFrame 對象,則只需傳入由列編號或列名組成的列表即可:
>>> import pandas as pd >>> pd.read_csv(r'C:\Users\TanRe\Desktop\test3.csv', index_col=['key1', 'key2'])value1 value2 key1 key2 one a 1 2b 3 4c 5 6d 7 8 two a 9 10b 11 12c 13 14d 15 16【01x04】sep 指定分隔符
在 read_table 中,sep 參數用于接收分隔符,如果遇到不是用固定的分隔符去分隔字段的,也可以傳遞一個正則表達式作為 read_table 的分隔符,如下面的 txt 文件數據之間是由不同的空白字符間隔開的:
>>> import pandas as pd >>> pd.read_table(r'C:\Users\TanRe\Desktop\test1.txt', sep='\s+')A B C aaa -0.264438 -1.026059 -0.619500 bbb 0.927272 0.302904 -0.032399 ccc -0.264273 -0.386314 -0.217601 ddd -0.871858 -0.348382 1.100491【01x05】skiprows 忽略行
skiprows 參數可用于設置需要忽略的行數,或需要跳過的行號列表,在下面的示例中,讀取文件時選擇跳過第1、3、4行(索引值分別為0、2、3):
>>> import pandas as pd >>> pd.read_csv(r'C:\Users\TanRe\Desktop\test4.csv', skiprows=[0, 2, 3])a b c d message 0 1 2 3 4 hello 1 5 6 7 8 world 2 9 10 11 12 python【01x06】na_values 設置缺失值
當文件中出現了空字符串或者 NA 值,Pandas 會將其標記成 NaN(缺失值),同樣也可以使用 isnull 方法來判斷結果值是否為缺失值:
>>> import pandas as pd >>> obj = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv') >>> objsomething a b c d message 0 one 1 2 3.0 4 NaN 1 two 5 6 NaN 8 world 2 three 9 10 11.0 12 python >>> >>> pd.isnull(obj)something a b c d message 0 False False False False False True 1 False False False True False False 2 False False False False False Falsena_values 方法可以傳遞一組值,將這組值設置為缺失值,如果傳遞的為字典對象,則字典的各值將被設置為 NaN:
>>> import pandas as pd >>> obj1 = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv') >>> obj1something a b c d message 0 one 1 2 3.0 4 NaN 1 two 5 6 NaN 8 world 2 three 9 10 11.0 12 python >>> >>> obj2 = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv', na_values=['1', '12']) >>> obj2something a b c d message 0 one NaN 2 3.0 4.0 NaN 1 two 5.0 6 NaN 8.0 world 2 three 9.0 10 11.0 NaN python >>> >>> sentinels = {'message': ['python', 'world'], 'something': ['two']} >>> obj3 = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv', na_values=sentinels) >>> obj3something a b c d message 0 one 1 2 3.0 4 NaN 1 NaN 5 6 NaN 8 NaN 2 three 9 10 11.0 12 NaN【01x07】nrows / chunksize 行與塊
以下 test6.csv 文件中包含 50 行數據:
可以設置 pd.options.display.max_rows 來緊湊地顯示指定行數的數據:
>>> import pandas as pd >>> pd.options.display.max_rows = 10 >>> pd.read_csv(r'C:\Users\TanRe\Desktop\test6.csv')one two three four key 0 0.467976 -0.038649 -0.295344 -1.824726 L 1 -0.358893 1.404453 0.704965 -0.200638 B 2 -0.501840 0.659254 -0.421691 -0.057688 G 3 0.204886 1.074134 1.388361 -0.982404 R 4 0.354628 -0.133116 0.283763 -0.837063 Q .. ... ... ... ... .. 45 2.311896 -0.417070 -1.409599 -0.515821 L 46 -0.479893 -0.633419 0.745152 -0.646038 E 47 0.523331 0.787112 0.486066 1.093156 K 48 -0.362559 0.598894 -1.843201 0.887292 G 49 -0.096376 -1.012999 -0.657431 -0.573315 0[50 rows x 5 columns]通過 nrows 參數可以讀取指定行數:
>>> import pandas as pd >>> pd.read_csv(r'C:\Users\TanRe\Desktop\test6.csv', nrows=5)one two three four key 0 0.467976 -0.038649 -0.295344 -1.824726 L 1 -0.358893 1.404453 0.704965 -0.200638 B 2 -0.501840 0.659254 -0.421691 -0.057688 G 3 0.204886 1.074134 1.388361 -0.982404 R 4 0.354628 -0.133116 0.283763 -0.837063 Q要逐塊讀取文件,可以指定 chunksize(行數):
>>> import pandas as pd >>> chunker = pd.read_csv(r'C:\Users\TanRe\Desktop\test6.csv', chunksize=50) >>> chunker <pandas.io.parsers.TextFileReader object at 0x07A20D60>返回的 TextParser 對象,可以根據 chunksize 對文件進行逐塊迭代。以下示例中,對 test6.csv 文件數據進行迭代處理,將值計數聚合到 “key” 列中:
>>> import pandas as pd >>> chunker = pd.read_csv(r'C:\Users\TanRe\Desktop\test6.csv', chunksize=50) >>> tot = pd.Series([], dtype='float64') >>> for piece in chunker:tot = tot.add(piece['key'].value_counts(), fill_value=0)>>> tot = tot.sort_values(ascending=False) >>> tot[:10] G 6.0 E 5.0 B 5.0 L 5.0 0 5.0 K 4.0 A 4.0 R 4.0 C 2.0 Q 2.0 dtype: float64這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106963135 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
【02x00】寫入數據
Pandas 提供了一些用于將表格型數據讀取為 DataFrame 對象的函數。常見方法如下:
| to_csv | 將對象寫入逗號分隔值(csv)文件 |
| to_clipboard | 將對象復制到系統剪貼板 |
| to_excel | 將對象寫入 Excel 工作表 |
| to_hdf | 使用 HDFStore 將包含的數據寫入 HDF5 文件 |
| to_html | 將 DataFrame 呈現為 HTML 表格 |
| to_json | 將對象轉換為 JSON( JavaScript Object Notation)字符串 |
| to_msgpack | 將對象寫入二進制格式編碼的文件(Pandas v1.0.0 中已刪除對 msgpack 的支持,建議使用 pyarrow) |
| to_pickle | Pickle(序列化)對象到文件 |
| to_sql | 將存儲在 DataFrame 中的數據寫入 SQL 數據庫 |
| to_stata | 將 DataFrame 對象導出為 Stata 格式 |
| to_feather | 將 DataFrames 寫入 Feather 二進制格式文件 |
以下以 to_csv 為例,它的參數同樣多達 50 多個,具體可參見官方文檔:
-
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html
-
https://pandas.pydata.org/docs/reference/api/pandas.Series.to_csv.html
【02x01】簡單示例
以之前的 test5.csv 文件為例,先讀出數據,再將數據寫入另外的文件:
>>> import pandas as pd >>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv') >>> datasomething a b c d message 0 one 1 2 3.0 4 NaN 1 two 5 6 NaN 8 world 2 three 9 10 11.0 12 python >>> >>> data.to_csv(r'C:\Users\TanRe\Desktop\out1.csv')【02x02】sep 指定分隔符
sep 參數可用于其他分隔符:
>>> import pandas as pd >>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv') >>> datasomething a b c d message 0 one 1 2 3.0 4 NaN 1 two 5 6 NaN 8 world 2 three 9 10 11.0 12 python >>> >>> data.to_csv(r'C:\Users\TanRe\Desktop\out2.csv', sep='|')【02x03】na_rep 替換缺失值
na_rep 參數可將缺失值(NaN)替換成其他字符串:
>>> import pandas as pd >>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv') >>> datasomething a b c d message 0 one 1 2 3.0 4 NaN 1 two 5 6 NaN 8 world 2 three 9 10 11.0 12 python >>> >>> data.to_csv(r'C:\Users\TanRe\Desktop\out3.csv', na_rep='X')【02x04】index / header 行與列標簽
設置 index=False, header=False,可以禁用行標簽與列標簽:
>>> import pandas as pd >>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv') >>> datasomething a b c d message 0 one 1 2 3.0 4 NaN 1 two 5 6 NaN 8 world 2 three 9 10 11.0 12 python >>> >>> data.to_csv(r'C:\Users\TanRe\Desktop\out4.csv', index=False, header=False)還可以傳入列表來重新設置列標簽:
>>> import pandas as pd >>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv') >>> datasomething a b c d message 0 one 1 2 3.0 4 NaN 1 two 5 6 NaN 8 world 2 three 9 10 11.0 12 python >>> >>> data.to_csv(r'C:\Users\TanRe\Desktop\out5.csv', header=['a', 'b', 'c', 'd', 'e', 'f'])【02x05】columns 指定列
可以通過設置 columns 參數,只寫入部分列,并按照指定順序排序:
>>> import pandas as pd >>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv') >>> datasomething a b c d message 0 one 1 2 3.0 4 NaN 1 two 5 6 NaN 8 world 2 three 9 10 11.0 12 python >>> >>> data.to_csv(r'C:\Users\TanRe\Desktop\out6.csv', columns=['c', 'b', 'a'])這里是一段防爬蟲文本,請讀者忽略。 本文原創首發于 CSDN,作者 TRHX。 博客首頁:https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106963135 未經授權,禁止轉載!惡意轉載,后果自負!尊重原創,遠離剽竊!
總結
以上是生活随笔為你收集整理的Python 数据分析三剑客之 Pandas(十):数据读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有什么样的理财方式,能既保障本金安全,又
- 下一篇: 信用卡审核要多久 信用卡审核很长时间