主要內(nèi)容:
- 導入導出本地數(shù)據(jù)
- pd.read_csv()
- pd.to_csv()
- pd.read_excel()
- pd.read_pickle & pd.to_pickle
本地數(shù)據(jù)的IO操作
pandas可以很方便的讀取/存儲各種格式的本地文件宪巨,讀取用read_xx()
,寫入用to_xx()
。
讀取 寫入
read_csv to_csv
read_excel to_excel
read_hdf to_hdf
read_sql to_sql
read_json to_json
read_msgpack (experimental) to_msgpack (experimental)
read_html to_html
read_gbq (experimental) to_gbq (experimental)
read_stata to_stata
read_sas
read_clipboard to_clipboard
read_pickle to_pickle
上面是官方文檔列出來的用來讀取數(shù)據(jù)的方法犁苏,支持好多格式的數(shù)據(jù)呢。有些我都沒見過沒聽說,我有用到的有csv, excel, json, pickle等。它們的用法都差不多官册,而且特別簡單。以read_csv()
為主簡單介紹一下pandas讀取和存儲數(shù)據(jù)的方法难捌。
pd.read_csv()
基本用法
In [1]: import pandas as pd
In [4]: data = pd.read_csv('D:/test.csv')
In [5]: data.head()
Out[5]:
Date Open High Low Close Volume Adj Close
0 2011/5/25 12355.45 12462.28 12271.90 12394.66 4.109670e+09 12394.66
1 2011/5/24 12381.87 12465.80 12315.42 12356.21 3.846250e+09 12356.21
2 2011/5/23 12511.29 12511.29 12292.49 12381.26 3.255580e+09 12381.26
3 2011/5/20 12604.64 12630.11 12453.96 12512.04 4.066020e+09 12512.04
4 2011/5/19 12561.46 12673.78 12506.67 12605.32 3.626110e+09 12605.32
什么參數(shù)都不設(shè)置的情況就是這樣膝宁,讀取進來之后是dataframe格式,自動生成數(shù)字索引根吁。
它的參數(shù)特別多T币!击敌!
種種參數(shù)
-
filepath_or_buffer
: 路徑或文件介返,也可以是URL地址。 -
sep
和delimiter
:分隔符。默認是','逗號圣蝎。 -
delim_whitespace
:布爾型刃宵,默認False。決定是否將空格當做分隔符徘公,相當于sep='\s+'
牲证。如果這里設(shè)置為True的話,delimiter
就不要設(shè)置參數(shù)了关面。
列坦袍、列名和索引
header
:設(shè)置作為列名的行,值可以是int或int組成的list缭裆,默認是'infer'键闺,如果names沒有傳參數(shù),把第一行當做列名澈驼。如果設(shè)置為None,自動生成一組數(shù)字列名筛武。names
:array-like缝其,默認None。也是用來設(shè)置列名的徘六,直接傳一個字符串組成的矩陣形式的的參數(shù)内边。index_col
:設(shè)置index〈猓可以是int或list(如果有多列索引用list)漠其,默認為None。-
還有其他呢竿音,不常用不列舉了和屎。下面挨個試試。
In [8]: data = pd.read_csv('D:/test.csv',header=None) In [9]: data.head(2) Out[9]: 0 1 2 3 4 5 6 0 Date Open High Low Close Volume Adj Close 1 2011/5/25 12355.45 12462.28 12271.9 12394.66 4109670000 12394.66 In [10]: data = pd.read_csv('D:/test.csv',names='abcdefg') In [11]: data.head(2) Out[11]: a b c d e f g 0 Date Open High Low Close Volume Adj Close 1 2011/5/25 12355.45 12462.28 12271.9 12394.66 4109670000 12394.66 In [12]: data = pd.read_csv('D:/test.csv',index_col='Date') In [13]: data.head(2) Out[13]: Open High Low Close Volume Adj Close Date 2011/5/25 12355.45 12462.28 12271.90 12394.66 4.109670e+09 12394.66 2011/5/24 12381.87 12465.80 12315.42 12356.21 3.846250e+09 12356.21
時間數(shù)據(jù)處理
parse_dates
:可以是布爾型春瞬、int柴信、ints或列名組成的list、dict宽气,默認為False随常。如果為True,解析index萄涯。如果為int或列名绪氛,嘗試解析所指定的列。如果是一個多列組成list涝影,嘗試把這些列組合起來當做時間來解析枣察。(敲厲害!0懒铡)infer_datetime_format
:布爾型询件。如果為True燃乍,而且也設(shè)置了parse_dates
參數(shù),可以提高速度宛琅。對于days開頭的敏感刻蟹。如果多列待解析的時間數(shù)據(jù)格式相同的話,這個可以大大提高解析速度嘿辟。(我數(shù)據(jù)不多舆瘪,感覺不出來。人家官方文檔說了红伦,反正啟用了也不會有副作用英古。)keep_date_col
:布爾型,默認False昙读。如果為Ture的話則保留原格式的時間列召调。-
date_parser
:設(shè)置解析時間數(shù)據(jù)所用的函數(shù),一般按默認的走就好了蛮浑。In [14]: data = pd.read_csv('D:/test.csv',index_col='Date',parse_dates=True) #注意Date那一列的格式變了唠叛,原來是字符串格式的, #現(xiàn)在變成了可以進行加減操作的日期格式沮稚。 In [15]: data.head(2) Out[15]: Open High Low Close Volume Adj Close Date 2011-05-25 12355.45 12462.28 12271.90 12394.66 4.109670e+09 12394.66 2011-05-24 12381.87 12465.80 12315.42 12356.21 3.846250e+09 12356.21 #這里從新讀取一個CSV文件艺沼,前三列組成日期。 In [21]: data2 = pd.read_csv('D:/test2.csv') In [22]: data2.head(2) Out[22]: Mon Day Year gas crude oil 0 1 3 1997 22.90 1.225 1 1 10 1997 23.56 1.241 #解析之后 In [23]: data2 = pd.read_csv('D:/test2.csv', : parse_dates={'date':[0,1,2]}, : index_col='date') : In [24]: data2.head(2) Out[24]: gas crude oil date 1997-01-03 22.90 1.225 1997-01-10 23.56 1.241 #保留原來的時間列 In [27]: data2 = pd.read_csv('D:/test2.csv',parse_dates={'date':[0,1,2]},infer_datetime_format=True,keep_date_col=True, ...: index_col='date') In [28]: data2.head(2) Out[28]: Mon Day Year gas crude oil date 1997-01-03 1 3 1997 22.90 1.225 1997-01-10 1 10 1997 23.56 1.241
啊蕴掏,驚艷了時光障般!就問你棒不棒,棒 不 棒 J⒔堋挽荡!
解析配置(好多的,我挑幾個可能會用的)
-
dtype
:設(shè)置數(shù)據(jù)類型饶唤,可以是類型名或{列名:類型名}組成的dict徐伐,默認None。 -
nrows
:int募狂,讀取多少行办素。大文件讀取片段時使用。 -
true_values
false_values
:被認為是True和False的值祸穷。 -
skiprows
:int或列表形式性穿,默認None。要跳過的行數(shù)雷滚,按索引(list)需曾,或者跳過頭幾行(int)。
空值和NA處理
-
na_values
:增加被當做NA/NaN的值。默認情況下這些數(shù)據(jù)會被認為是NA值呆万,'-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A N/A', '#N/A', 'N/A', 'NA', '#NA', 'NULL', 'NaN', '-NaN', 'nan', '-nan', ''
商源。 -
keep_default_na
:布爾型,默認True谋减。如果值為False牡彻,而且na_values
進行了設(shè)置,那么NA值會被重寫出爹,使用你設(shè)置的而不是上邊所列出來的庄吼。 -
na_filter
:布爾型,默認True严就。檢測缺失值(空值和NA值)標記总寻。如果文件沒有NA值,設(shè)置na_filter=False
可以提高讀取大文件速度梢为。 -
skip_blank_lines
:布爾型渐行,默認True。跳過空行抖誉,而不是解析為NA值殊轴。
啊,還有引用袒炉、注釋、字符格式等等參數(shù)樊零,一般不會到那么細枝末節(jié)的地步我磁,不說了。
read_csv()
和read_table()
幾乎相等驻襟,不單單可以讀取以逗號分割的CSV格式夺艰,你可以通過設(shè)置sep參數(shù)讓它讀取各種不同分割符號的文本文件等等。
可用參數(shù)是很多沉衣,但這個方法用起來很簡單郁副。唯一一個必須的參數(shù)就是需要讀取文件的路徑/地址。寫入和讀取類似豌习,用法都一樣存谎。
下面的幾個方法我就不再解釋參數(shù),其實都類似的肥隆,直接舉幾個例子看看好了既荚。
pd.to_csv()
In [2]: import pandas as pd
: data = pd.read_csv('D:/test.csv',index_col='Date',parse_dates=True)
:
In [5]: data[:5]
Out[5]:
Open High Low Close Volume Adj Close
Date
2011-05-25 12355.45 12462.28 12271.90 12394.66 4.109670e+09 12394.66
2011-05-24 12381.87 12465.80 12315.42 12356.21 3.846250e+09 12356.21
2011-05-23 12511.29 12511.29 12292.49 12381.26 3.255580e+09 12381.26
2011-05-20 12604.64 12630.11 12453.96 12512.04 4.066020e+09 12512.04
2011-05-19 12561.46 12673.78 12506.67 12605.32 3.626110e+09 12605.32
#把data中Open和Close列的前五行寫入to.csv文件中。
In [9]: data[:5].to_csv('D:/to.csv', columns=['Open','Close'])
In [10]: data2 = pd.read_csv('D:/to.csv')
#把剛生成的to.csv再讀進來看看對不對栋艳。
In [11]: data2
Out[11]:
Date Open Close
0 2011-05-25 12355.45 12394.66
1 2011-05-24 12381.87 12356.21
2 2011-05-23 12511.29 12381.26
3 2011-05-20 12604.64 12512.04
4 2011-05-19 12561.46 12605.32
pd.read_excel()
In [19]: excel = pd.read_excel('D:/test.xlsx', sheetname='Sheet1')
In [20]: excel.head(2)
Out[20]:
Month Day Year gas crude oil
0 1 3 1997 22.90 1.225
1 1 10 1997 23.56 1.241
In [21]: excel['Date']=pd.to_datetime(excel[['Year','Month','Day']])
In [22]: excel = excel.set_index("Date")
In [23]: excel.head(2)
Out[23]:
Month Day Year gas crude oil
Date
1997-01-03 1 3 1997 22.90 1.225
1997-01-10 1 10 1997 23.56 1.241
pd.read_pickle & pd.to_pickle
pickle這個用起來特別簡單恰聘,根本就沒有其他參數(shù)。它比較特殊的是可以實現(xiàn)將數(shù)據(jù)或?qū)ο笮蛄谢癁樽止?jié)流,pickling也就是保存為二進制數(shù)晴叨,unpickling就是相反的過程凿宾。pickle的意思是泡菜,把數(shù)據(jù)泡起來之后就可以長久存放不容易變質(zhì)兼蕊,pickle被當做永久儲存數(shù)據(jù)的一個方法初厚。
我見過用pickle保存數(shù)據(jù)是在機器學習中。把訓練好的模型存成pickle文件遍略,下次使用這個模型的時候直接讀取pickle文件惧所,而不需要再次訓練。