【培訓】Python常用工具的使用-Pandas

Python Data Analysis Library(Pandas)是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務而創(chuàng)建的莹桅。Pandas 納入了大量庫和一些標準的數(shù)據(jù)模型倦春,提供了高效地操作大型數(shù)據(jù)集所需的工具涩拙。通過Pandas讀取和保存數(shù)據(jù)蚊丐,可以大大方便數(shù)據(jù)的統(tǒng)計與查看飘蚯。

一些有用的鏈接:
項目地址:http://pandas.pydata.org/
官方文檔:http://pandas.pydata.org/pandas-docs/stable/
快速入門:10 Minutes to pandas
翻譯版快速入門:十分鐘搞定pandas
Panda速查手冊:Pandas速查手冊中文版

安裝

直接通過pip安裝:(通過-i參數(shù)使用豆瓣的鏡像馍迄,下載較快)

pip install pandas -i https://pypi.douban.com/simple/

在數(shù)據(jù)分析和科學計算領(lǐng)域,有很多包是非常實用的局骤,然而用原生Python安裝這些包坑比較多攀圈,特別是在Windows環(huán)境下。大家可以嘗試Python的一個發(fā)行包——Anaconda或者Miniconda峦甩,已經(jīng)集成了numpy赘来、scipy等等常用的庫现喳。然后就可以使用它們自身的包管理工具conda進行安裝:

conda install pandas

安裝完成后,在Python中引入一下犬辰,驗證是否安裝成功嗦篱,一種常用的引入寫法是:

import pandas as pd

對象創(chuàng)建

在pandas中,我們常用的有兩種對象:Series和Dataframe幌缝【拇伲可以簡單理解為:Series是一維的數(shù)組,而Dataframe是二維的表格涵卵。

Series

Series的創(chuàng)建支持多種方式浴栽,常用的方式為通過python的list構(gòu)建,這種方式下如果不指定index轿偎,會自動對每個元素生成int類型的index典鸡。

In [4]: s = pd.Series([1,3,5,np.nan,6,8])

In [5]: s
Out[5]: 
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64

另外一種方式是通過Python的字典進行構(gòu)建,key值會自動作為index坏晦。

In [6]: sd = {"python":8000, "c++":8100, "c#":4000}

In [7]: s = pd.Series(sd)
In [8]: s
Out[8]: 
c#          4000
c++         8100
python      8000

Dataframe

Dataframe的創(chuàng)建萝玷,一般有以下幾種方式:

  • 通過Python的字典創(chuàng)建,字典的key值為column的標簽英遭,value值為對應column的序列:
>>> d = {'col1': [1, 2], 'col2': [3, 4]}
>>> df = pd.DataFrame(data=d)
>>> df
   col1  col2
0     1     3
1     2     4
  • 通過字典的字典構(gòu)建,各內(nèi)層字典會成為一列亦渗,每個字典的鍵會被合并成結(jié)果的index:
In [227]: nest_dict={'shanghai':{2015:100,2016:101},'beijing':{2015:102,2016:103}}  
  
In [228]: nest_dict  
Out[228]: {'beijing': {2015: 102, 2016: 103}, 'shanghai': {2015: 100, 2016: 101}}  
  
In [229]: df1=DataFrame(nest_dict)  
  
In [230]: df1  
Out[230]:   
      beijing  shanghai  
2015      102       100  
2016      103       101  
  • 通過Series組成的字典創(chuàng)建挖诸,每個Series會成為Dataframe的一列,不指定索引的話法精,每個series的索引會合并(也就是自動對齊)多律。

In [2]: Shanghai_data = pd.Series({"2015":102,"2016":103})

In [3]: Beijing_data = pd.Series({"2015":105,"2016":106})

In [4]: nest_dict = {"Beijing":Beijing_data, "Shanghai":Shanghai_data}

In [5]: df = pd.DataFrame(nest_dict)

In [6]: df
Out[6]:
      Beijing  Shanghai
2015      105       102
2016      106       103
  • 字典或者Series的list,各個項會成為Dataframe的一行搂蜓。字典鍵或Series的索引的并集成為Dataframe的列標狼荞。
In [9]: nest_list = [Beijing_data, Shanghai_data]

In [10]: df = pd.DataFrame(nest_list)

In [11]: df = pd.DataFrame(nest_list, index=["Beijing", "Shanghai"])

In [12]: df
Out[12]:
          2015  2016
Beijing    105   106
Shanghai   102   103

數(shù)據(jù)查看

pandas提供了非常方便地查看數(shù)據(jù)的方式,常用的方式有:

  • 查看頭尾的數(shù)據(jù)
In [33]: finance.head(5)
Out[33]: 
                  Open        High         Low       Close   Adj Close  \
Date                                                                     
2017-10-10  181.649994  184.460007  181.360001  183.119995  183.119995   
2017-10-11  183.000000  184.699997  182.600998  184.690002  184.690002   
2017-10-12  184.039993  184.389999  180.348007  180.529999  180.529999   
2017-10-13  180.960007  181.399994  177.970001  178.449997  178.449997   
2017-10-16  180.000000  180.050003  178.509995  179.559998  179.559998  

In [34]: finance.tail(5)
Out[34]: 
                  Open        High         Low       Close   Adj Close  \
Date                                                                     
2017-10-31  183.570007  185.119995  181.811005  184.889999  184.889999   
2017-11-01  187.880005  188.880005  183.580002  186.080002  186.080002   
2017-11-02  190.990005  191.220001  183.309998  184.809998  184.809998   
2017-11-03  186.509995  186.929993  182.059998  183.210007  183.210007   
2017-11-06  184.070007  188.250000  184.000000  187.839996  187.839996   
  • 查看索引帮碰、列

In [35]: finance.index
Out[35]: 
DatetimeIndex(['2017-10-10', '2017-10-11', '2017-10-12', '2017-10-13',
               '2017-10-16', '2017-10-17', '2017-10-18', '2017-10-19',
               '2017-10-20', '2017-10-23', '2017-10-24', '2017-10-25',
               '2017-10-26', '2017-10-27', '2017-10-30', '2017-10-31',
               '2017-11-01', '2017-11-02', '2017-11-03', '2017-11-06'],
              dtype='datetime64[ns]', name=u'Date', freq=None)

In [36]: finance.columns
Out[36]: Index([u'Open', u'High', u'Low', u'Close', u'Adj Close', u'Volume'], dtype='object')
  • describe快速統(tǒng)計
In [38]: finance.describe()
Out[38]: 
             Open        High         Low       Close   Adj Close  \
count   20.000000   20.000000   20.000000   20.000000   20.000000   
mean   180.204551  181.721499  177.627500  179.423000  179.423000   
std      5.166460    5.015834    4.803680    5.185056    5.185056   
min    170.619995  171.449997  168.580002  170.220001  170.220001   
25%    177.067749  179.142502  174.790001  175.942497  175.942497   
50%    179.790001  180.759995  177.779998  179.585000  179.585000   
75%    183.687503  184.804997  181.873253  183.580006  183.580006   
max    190.990005  191.220001  184.000000  187.839996  187.839996   
  • 按值進行排序
In [41]: finance.sort_values(by=["Open"])
Out[41]: 
                  Open        High         Low       Close   Adj Close  \
Date                                                                     
2017-10-26  170.619995  171.449997  168.580002  170.320007  170.320007   
2017-10-27  173.190002  177.000000  171.110001  176.149994  176.149994   
2017-10-24  174.000000  175.979996  173.259995  173.699997  173.699997   
2017-10-25  174.690002  175.440002  169.300003  170.220001  170.220001   
2017-10-19  177.001007  179.610001  175.449997  177.929993  177.929993   
2017-10-18  177.089996  180.000000  176.279999  179.610001  179.610001   
2017-10-23  177.800003  178.009995  173.050003  173.130005  173.130005   
2017-10-30  178.429993  181.899994  177.589996  181.580002  181.580002   
2017-10-20  179.020004  179.520004  177.080002  177.320007  177.320007   
2017-10-17  179.580002  180.119995  175.300003  175.320007  175.320007   
2017-10-16  180.000000  180.050003  178.509995  179.559998  179.559998   
2017-10-13  180.960007  181.399994  177.970001  178.449997  178.449997   
2017-10-10  181.649994  184.460007  181.360001  183.119995  183.119995   
2017-10-11  183.000000  184.699997  182.600998  184.690002  184.690002   
2017-10-31  183.570007  185.119995  181.811005  184.889999  184.889999   
2017-10-12  184.039993  184.389999  180.348007  180.529999  180.529999   
2017-11-06  184.070007  188.250000  184.000000  187.839996  187.839996   
2017-11-03  186.509995  186.929993  182.059998  183.210007  183.210007   
2017-11-01  187.880005  188.880005  183.580002  186.080002  186.080002   
2017-11-02  190.990005  191.220001  183.309998  184.809998  184.809998   

數(shù)據(jù)選擇

1.選擇特定列和行的數(shù)據(jù)
a['x'] 那么將會返回columns為x的列相味,注意這種方式一次只能返回一個列。a.x與a['x']意思一樣殉挽。

取行數(shù)據(jù)丰涉,通過切片[]來選擇
如:a[0:3] 則會返回前三行的數(shù)據(jù)。

2.loc是通過標簽來選擇數(shù)據(jù)
a.loc['one']則會默認表示選取行為'one'的行斯碌;

a.loc[:,['a','b'] ] 表示選取所有的行以及columns為a,b的列一死;

a.loc[['one','two'],['a','b']] 表示選取'one'和'two'這兩行以及columns為a,b的列;

a.loc['one','a']與a.loc[['one'],['a']]作用是一樣的傻唾,不過前者只顯示對應的值投慈,而后者會顯示對應的行和列標簽。

3.iloc則是直接通過位置來選擇數(shù)據(jù)
這與通過標簽選擇類似
a.iloc[1:2,1:2] 則會顯示第一行第一列的數(shù)據(jù);(切片后面的值取不到)

a.iloc[1:2] 即后面表示列的值沒有時,默認選取行位置為1的數(shù)據(jù);

a.iloc[[0,2],[1,2]] 即可以自由選取行位置伪煤,和列位置對應的數(shù)據(jù)加袋。

4.使用條件來選擇
使用單獨的列來選擇數(shù)據(jù)
a[a.c>0] 表示選擇c列中大于0的數(shù)據(jù)

使用where來選擇數(shù)據(jù)
a[a>0] 表直接選擇a中所有大于0的數(shù)據(jù)

使用isin()選出特定列中包含特定值的行
a1=a.copy()
a1[a1['one'].isin(['2','3'])] 表顯示滿足條件:列one中的值包含'2','3'的所有行。

作者:是藍先生
鏈接:http://www.reibang.com/p/682c24aef525
來源:簡書
著作權(quán)歸作者所有带族。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)锁荔,非商業(yè)轉(zhuǎn)載請注明出處。

缺失值處理

初始化過后蝙砌,缺失的值會暫時以np.nan代替(Numpy中的空值)阳堕,可能會妨礙進一步的運算,一般通過fillna()進行處理择克。
df.fillna(value=0)

導入導出文件

推薦導入導出均使用csv文件恬总,參考:IO Tools
寫入csv文件:
df.to_csv("foo.csv")
從csv文件讀取:
pd.read_csv("foo.csv")

作業(yè)

  1. 閱讀“十分鐘搞定pandas”肚邢,了解pandas的一些基礎(chǔ)用法
  2. 讀取阿里巴巴股票數(shù)據(jù)壹堰,并對該Dataframe進行基本操作的練習(查看數(shù)據(jù)、選擇數(shù)據(jù))PS. 需要多安裝一個庫:pandas-datareader
    讀取示例代碼:
In [1]: import pandas 
In [2]: from pandas_datareader import data
In [3]: sym = "BABA"
In [4]: finance = data.DataReader(sym, "yahoo", start="2017/10/11")
  1. 從Python S1培訓的大作業(yè)數(shù)據(jù)中骡湖,選出詞頻前100的單詞贱纠,整理成(單詞、詞頻數(shù)量响蕴、排名前百分之幾)的形式谆焊,保存為csv格式文件。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浦夷,一起剝皮案震驚了整個濱河市辖试,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劈狐,老刑警劉巖罐孝,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肥缔,居然都是意外死亡莲兢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門续膳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怒见,“玉大人,你說我怎么就攤上這事姑宽∏菜#” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵炮车,是天一觀的道長舵变。 經(jīng)常有香客問我酣溃,道長,這世上最難降的妖魔是什么纪隙? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任赊豌,我火速辦了婚禮,結(jié)果婚禮上绵咱,老公的妹妹穿的比我還像新娘碘饼。我一直安慰自己,他們只是感情好悲伶,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布艾恼。 她就那樣靜靜地躺著,像睡著了一般麸锉。 火紅的嫁衣襯著肌膚如雪钠绍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天花沉,我揣著相機與錄音柳爽,去河邊找鬼。 笑死碱屁,一個胖子當著我的面吹牛磷脯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娩脾,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赵誓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晦雨?” 一聲冷哼從身側(cè)響起架曹,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤隘冲,失蹤者是張志新(化名)和其女友劉穎闹瞧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體展辞,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡奥邮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了罗珍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洽腺。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖覆旱,靈堂內(nèi)的尸體忽然破棺而出蘸朋,到底是詐尸還是另有隱情,我是刑警寧澤扣唱,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布藕坯,位于F島的核電站团南,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炼彪。R本人自食惡果不足惜吐根,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辐马。 院中可真熱鬧拷橘,春花似錦、人聲如沸喜爷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贞奋。三九已至赌厅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轿塔,已是汗流浹背特愿。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勾缭,地道東北人揍障。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像俩由,于是被迫代替她去往敵國和親毒嫡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容