Python易筋經(jīng)-pandas

“寵辱若驚忱嘹,貴大患若身。
何謂寵辱若驚耕渴?
寵為下德谅。
得之若驚,失之若驚萨螺,是謂寵辱若驚窄做。
何謂貴大患若身?
吾所以有大患者慰技,為吾有身椭盏。
及吾無身,吾有何患吻商?
故貴以身為天下掏颊,若可以寄于天下,愛以身為天下者艾帐,若可托天下乌叶。”[1]

pandas

pandas是基于numpy構(gòu)建的柒爸,讓以 Numpy 為中心的應用變得更加簡單准浴。
pandas主要有Series(對映一維數(shù)組),DataFrame(對映二維數(shù)組)捎稚,Panel(對映三維數(shù)組)乐横,Panel4D(對映四維數(shù)組),PanelND(多維)等數(shù)據(jù)結(jié)構(gòu)今野。

  • Series
    一維數(shù)組葡公,與Numpy中的一維array類似。二者與Python基本的數(shù)據(jù)結(jié)構(gòu)List也很相近条霜,其區(qū)別是:List中的元素可以是不同的數(shù)據(jù)類型催什,而Array和Series中則只允許存儲相同的數(shù)據(jù)類型,這樣可以更有效的使用內(nèi)存宰睡,提高運算效率蒲凶。
  • DataFrame
    二維的表格型數(shù)據(jù)結(jié)構(gòu)。很多功能與R中的data.frame類似夹厌”可以將DataFrame理解為Series的容器裆悄。以下的內(nèi)容主要以DataFrame為主矛纹。
  • Panel
    三維的數(shù)組,可以理解為DataFrame的容器光稼。

導入包:

import numpy as np
import pandas as pd

Series

由一組數(shù)據(jù)(各種Numpy數(shù)據(jù)類型)或南,以及一組與之相關的標簽數(shù)據(jù)(即索引)組成孩等。僅由一組數(shù)據(jù)即可產(chǎn)生最簡單的Series,可以通過傳遞一個list對象來創(chuàng)建一個Series采够。

arr = pd.Series([1,3,4,5,6,7,0,4])
arr

輸出:

0    1
1    3
2    4
3    5
4    6
5    7
6    0
7    4
dtype: int64

獲取 Series 的索引:

arr.index

輸出:

RangeIndex(start=0, stop=8, step=1)

DataFrame

DataFrame是一個表格型的數(shù)據(jù)結(jié)構(gòu)肄方,它含有一組有序的列,每一列的數(shù)據(jù)結(jié)構(gòu)都是相同的蹬癌,而不同的列之間則可以是不同的數(shù)據(jù)結(jié)構(gòu)(數(shù)值权她、字符、布爾值等)逝薪∮缫或者以數(shù)據(jù)庫進行類比,DataFrame中的每一行是一個記錄董济,名稱為Index的一個元素步清,而每一列則為一個字段,是這個記錄的一個屬性虏肾。DataFrame既有行索引也有列索引廓啊,可以被看做由Series組成的字典(共用同一個索引)。
創(chuàng)建一個DataFrame封豪,包括一個numpy array, 時間索引和列名字:

dates = pd.date_range('20180101',periods=6)
dates

輸出:

DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
               '2018-01-05', '2018-01-06'],
              dtype='datetime64[ns]', freq='D')

創(chuàng)建DataFrame谴轮,如:

df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
df

np.random.randn(6,4) 從標準正態(tài)分布中創(chuàng)建6行4列的二維矩陣

輸出:

            A           B           C           D
2018-01-01  -0.538987   -1.173826   1.607785    -1.168397
2018-01-02  -0.987674   -0.961643   -0.636837   -0.607176
2018-01-03  -1.065446   0.686846    -0.241674   0.296789
2018-01-04  0.338885    0.459906    0.852208    1.007623
2018-01-05  -0.227588   0.872227    2.077327    0.886460
2018-01-06  -0.838204   0.087443    0.537748    1.372528

通過傳遞一個能夠被轉(zhuǎn)換成類似序列結(jié)構(gòu)的字典對象來創(chuàng)建一個DataFrame:

df1 = pd.DataFrame({'A':3.,
                  'B':pd.date_range('20180101',periods=6),
                  'C':np.array([2]*6,dtype='int32'),
                  'D':pd.Series(2,index=list(range(6)),dtype='float32')
                   })
df1

輸出:


    A   B           C   D
0   3.0 2018-01-01  2   2.0
1   3.0 2018-01-02  2   2.0
2   3.0 2018-01-03  2   2.0
3   3.0 2018-01-04  2   2.0
4   3.0 2018-01-05  2   2.0
5   3.0 2018-01-06  2   2.0

查看不同列的數(shù)據(jù)類型:

df1.dtypes

輸出:

A           float64
B    datetime64[ns]
C             int32
D           float32
dtype: object

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

以df為數(shù)據(jù)藍本,查看前2條記錄:

df.head(2)

輸出:

            A           B           C           D
2018-01-01  -0.538987   -1.173826   1.607785    -1.168397
2018-01-02  -0.987674   -0.961643   -0.636837   -0.607176

查看后2條記錄:

df.tail(2)

輸出:

            A           B           C           D
2018-01-05  -0.227588   0.872227    2.077327    0.886460
2018-01-06  -0.838204   0.087443    0.537748    1.372528

顯示索引吹埠、列和底層的numpy數(shù)據(jù):

df.index

輸出:

DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
               '2018-01-05', '2018-01-06'],
              dtype='datetime64[ns]', freq='D')

查看 DataFrame 的列名

df.columns

輸出:

Index(['A', 'B', 'C', 'D'], dtype='object')

查看 DataFrame 的值:

df.values

輸出:

array([[-0.53898743, -1.17382617,  1.60778544, -1.16839686],
       [-0.98767434, -0.96164339, -0.63683738, -0.60717624],
       [-1.06544554,  0.68684576, -0.24167378,  0.29678857],
       [ 0.33888503,  0.45990635,  0.85220803,  1.0076235 ],
       [-0.22758765,  0.87222716,  2.07732729,  0.88645989],
       [-0.83820381,  0.08744284,  0.53774757,  1.37252846]])

describe()函數(shù)對于數(shù)據(jù)的快速統(tǒng)計匯總:

df.describe()

輸出:

       A        B           C            D
count   6.000000    6.000000    6.000000    6.000000
mean    -0.553169   -0.004841   0.699426    0.297971
std 0.535618    0.866508    1.043502    0.997409
min -1.065446   -1.173826   -0.636837   -1.168397
25% -0.950307   -0.699372   -0.046818   -0.381185
50% -0.688596   0.273675    0.694978    0.591624
75% -0.305438   0.630111    1.418891    0.977333
max 0.338885    0.872227    2.077327    1.372528

對結(jié)果簡單解釋一下:

count:數(shù)量
mean:平均值
std:標準偏差
min:最小值
max:最大值

其中25% 50% 75% 四分位數(shù)书聚;即把數(shù)值由小到大排列并分成四等份,處于三個分割點位置的數(shù)值就是四分位數(shù)藻雌。
第1四分位數(shù) (Q1)雌续,又稱“較小四分位數(shù)”,等于該樣本中所有數(shù)值由小到大排列后第25%的數(shù)字胯杭。
第2四分位數(shù) (Q2)驯杜,又稱“中位數(shù)”,等于該樣本中所有數(shù)值由小到大排列后第50%的數(shù)字做个。
第3四分位數(shù) (Q3)鸽心,又稱“較大四分位數(shù)”,等于該樣本中所有數(shù)值由小到大排列后第75%的數(shù)字居暖。
第3四分位數(shù)與第1四分位數(shù)的差距又稱四分位距(InterQuartile Range,IQR)

轉(zhuǎn)置:df.transpose() or .T

df.transpose() or df.T

輸出:

    2018-01-01 00:00:00 2018-01-02 00:00:00 2018-01-03 00:00:00 2018-01-04 00:00:00 2018-01-05 00:00:00 2018-01-06 00:00:00
A   -0.538987   -0.987674   -1.065446   0.338885    -0.227588   -0.838204
B   -1.173826   -0.961643   0.686846    0.459906    0.872227    0.087443
C   1.607785    -0.636837   -0.241674   0.852208    2.077327    0.537748
D   -1.168397   -0.607176   0.296789    1.007623    0.886460    1.372528

按值進行排序

df.sort_values(by='A',ascending=False)

輸出:

            A           B           C           D
2018-01-04  0.338885    0.459906    0.852208    1.007623
2018-01-05  -0.227588   0.872227    2.077327    0.886460
2018-01-01  -0.538987   -1.173826   1.607785    -1.168397
2018-01-06  -0.838204   0.087443    0.537748    1.372528
2018-01-02  -0.987674   -0.961643   -0.636837   -0.607176
2018-01-03  -1.065446   0.686846    -0.241674   0.296789

獲取數(shù)據(jù)

  • 按列獲取數(shù)據(jù)
df['A']

輸出:

2018-01-01   -0.538987
2018-01-02   -0.987674
2018-01-03   -1.065446
2018-01-04    0.338885
2018-01-05   -0.227588
2018-01-06   -0.838204
Freq: D, Name: A, dtype: float64

按列取多列

df[['A','B']]

輸出:

            A           B
2018-01-01  -0.538987   -1.173826
2018-01-02  -0.987674   -0.961643
2018-01-03  -1.065446   0.686846
2018-01-04  0.338885    0.459906
2018-01-05  -0.227588   0.872227
2018-01-06  -0.838204   0.087443
  • 按行獲取數(shù)據(jù)
df[:3]

輸出:

            A           B           C           D
2018-01-01  -0.538987   -1.173826   1.607785    -1.168397
2018-01-02  -0.987674   -0.961643   -0.636837   -0.607176
2018-01-03  -1.065446   0.686846    -0.241674   0.296789

貌似等效于df.head(3)
.ix(位置or標簽起顽频,位置or標簽止)來獲取數(shù)據(jù),它自動根據(jù)給到的索引類型判斷是使用位置還是標簽進行切片太闺。

df.ix['2018-01-01':'2018-01-02']

輸出:

            A           B           C           D
2018-01-01  -0.538987   -1.173826   1.607785    -1.168397
2018-01-02  -0.987674   -0.961643   -0.636837   -0.607176
df.ix[1,1]

輸出:

-0.96164339276293087
df.ix[1,'C']

輸出:

-0.63683738086017361

通過邏輯指針進行數(shù)據(jù)切片:

df[邏輯條件]
df[df.xxx >= 2] #單個邏輯條件
df[(df.xxx >=1 ) & (df.xxx < 3) ] #多個邏輯條件組合

df[df.A>0]

輸出:


            A           B           C           D
2018-01-04  0.338885    0.459906    0.852208    1.007623

可以利用邏輯條件進行更改數(shù)據(jù)

panel (略)

略.....

缺失數(shù)據(jù)處理

去掉包含缺失值的行

  • df.dropna()
    將有缺失數(shù)據(jù)行丟棄
  • df.fillna(value=0)
    將缺失項賦值0
  • df.isnull(df)
    判斷數(shù)據(jù)是否為nan糯景,并進行布爾填充

函數(shù)的應用和映射

列計算平均值

df.mean()

輸出:

A   -0.553169
B   -0.004841
C    0.699426
D    0.297971
dtype: float64

行計算平均值

df.mean(1)

輸出:

2018-01-01   -0.318356
2018-01-02   -0.798333
2018-01-03   -0.080871
2018-01-04    0.664656
2018-01-05    0.902107
2018-01-06    0.289879
Freq: D, dtype: float64

羅列出其他常用的方法:

count 非na值的數(shù)量

describe 針對Series或個DataFrame列計算匯總統(tǒng)計

min、max 計算最小值和最大值

argmin、argmax 計算能夠獲取到最大值和最小值得索引位置(整數(shù))

idxmin蟀淮、idxmax 計算能夠獲取到最大值和最小值得索引值

quantile 計算樣本的分位數(shù)(0到1)

sum 值的總和

mean 值得平均數(shù)

median 值得算術中位數(shù)(50%分位數(shù))

mad 根據(jù)平均值計算平均絕對離差

var 樣本值的方差

std 樣本值的標準差

skew 樣本值得偏度(三階矩)

kurt 樣本值得峰度(四階矩)

cumsum 樣本值得累計和

cummin最住,cummax 樣本值得累計最大值和累計最小值

cumprod 樣本值得累計積

diff 計算一階差分(對時間序列很有用)

pct_change 計算百分數(shù)變化

數(shù)據(jù)規(guī)整

Pandas提供了大量的方法能夠輕松的對Series,DataFrame和Panel對象進行各種符合各種邏輯關系的合并操作

  • concat 可以沿一條軸將多個對象堆疊到一起怠惶。
  • append 將一行連接到一個DataFrame上
  • duplicated 移除重復數(shù)據(jù)

  1. 老子《道德經(jīng)》第十三章涨缚,老子故里,中國鹿邑策治。 ?

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脓魏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子通惫,更是在濱河造成了極大的恐慌轧拄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讽膏,死亡現(xiàn)場離奇詭異檩电,居然都是意外死亡,警方通過查閱死者的電腦和手機府树,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門俐末,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奄侠,你說我怎么就攤上這事卓箫。” “怎么了垄潮?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵烹卒,是天一觀的道長。 經(jīng)常有香客問我弯洗,道長旅急,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任牡整,我火速辦了婚禮藐吮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逃贝。我一直安慰自己谣辞,他們只是感情好,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布沐扳。 她就那樣靜靜地躺著泥从,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沪摄。 梳的紋絲不亂的頭發(fā)上躯嫉,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天纱烘,我揣著相機與錄音,去河邊找鬼和敬。 笑死凹炸,一個胖子當著我的面吹牛戏阅,可吹牛的內(nèi)容都是我干的昼弟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼奕筐,長吁一口氣:“原來是場噩夢啊……” “哼舱痘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起离赫,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤芭逝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渊胸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旬盯,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年翎猛,在試婚紗的時候發(fā)現(xiàn)自己被綠了胖翰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡切厘,死狀恐怖萨咳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疫稿,我是刑警寧澤培他,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站遗座,受9級特大地震影響舀凛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜途蒋,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一腾降、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碎绎,春花似錦螃壤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至日麸,卻和暖如春寄啼,著一層夾襖步出監(jiān)牢的瞬間逮光,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工墩划, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涕刚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓乙帮,卻偏偏與公主長得像杜漠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子察净,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

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