Python 數據分析三劍客之 Pandas(十):數據讀寫

CSDN 課程推薦:《邁向數據科學家:帶你玩轉Python數據分析》,講師齊偉,蘇州研途教育科技有限公司CTO,蘇州大學應用統計專業碩士生指導委員會委員;已出版《跟老齊學Python:輕鬆入門》《跟老齊學Python:Django實戰》、《跟老齊學Python:數據分析》和《Python大學實用教程》暢銷圖書。


Pandas 系列文章:


另有 NumPy、Matplotlib 系列文章已更新完畢,歡迎關注:


推薦學習資料與網站(博主參與部分文檔翻譯):



這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 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 文件:

01

使用 read_csv 方法將其讀出爲一個 DataFrame 對象:

>>> import pandas as pd
>>> obj = pd.read_csv(r'C:\Users\TanRe\Desktop\test1.csv')
>>> obj
   a   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=',')
>>> obj
   a   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 方法也會默認將第一行當作列標籤:

02

>>> import pandas as pd
>>> obj = pd.read_csv(r'C:\Users\TanRe\Desktop\test2.csv')
>>> obj
   1   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 的行索引:

02

>>> 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 對象,則只需傳入由列編號或列名組成的列表即可:

03

>>> 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       2
     b          3       4
     c          5       6
     d          7       8
two  a          9      10
     b         11      12
     c         13      14
     d         15      16

【01x04】sep 指定分隔符

在 read_table 中,sep 參數用於接收分隔符,如果遇到不是用固定的分隔符去分隔字段的,也可以傳遞一個正則表達式作爲 read_table 的分隔符,如下面的 txt 文件數據之間是由不同的空白字符間隔開的:

04

>>> 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):

05

>>> 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 方法來判斷結果值是否爲缺失值:

06

>>> import pandas as pd
>>> obj = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv')
>>> obj
  something  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    False

na_values 方法可以傳遞一組值,將這組值設置爲缺失值,如果傳遞的爲字典對象,則字典的各值將被設置爲 NaN:

>>> import pandas as pd
>>> obj1 = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv')
>>> obj1
  something  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'])
>>> obj2
  something    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)
>>> obj3
  something  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 行數據:

07

可以設置 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 多個,具體可參見官方文檔:

【02x01】簡單示例

以之前的 test5.csv 文件爲例,先讀出數據,再將數據寫入另外的文件:

>>> import pandas as pd
>>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv')
>>> data
  something  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')

08

【02x02】sep 指定分隔符

sep 參數可用於其他分隔符:

>>> import pandas as pd
>>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv')
>>> data
  something  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='|')

09

【02x03】na_rep 替換缺失值

na_rep 參數可將缺失值(NaN)替換成其他字符串:

>>> import pandas as pd
>>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv')
>>> data
  something  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')

10

【02x04】index / header 行與列標籤

設置 index=False, header=False,可以禁用行標籤與列標籤:

>>> import pandas as pd
>>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv')
>>> data
  something  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)

11

還可以傳入列表來重新設置列標籤:

>>> import pandas as pd
>>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv')
>>> data
  something  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'])

12

【02x05】columns 指定列

可以通過設置 columns 參數,只寫入部分列,並按照指定順序排序:

>>> import pandas as pd
>>> data = pd.read_csv(r'C:\Users\TanRe\Desktop\test5.csv')
>>> data
  something  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'])

13


這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 CSDN,作者 TRHX。
博客首頁:https://itrhx.blog.csdn.net/
本文鏈接:https://itrhx.blog.csdn.net/article/details/106963135
未經授權,禁止轉載!惡意轉載,後果自負!尊重原創,遠離剽竊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章