“寵辱若驚忱嘹,貴大患若身。
何謂寵辱若驚耕渴?
寵為下德谅。
得之若驚,失之若驚萨螺,是謂寵辱若驚窄做。
何謂貴大患若身?
吾所以有大患者慰技,為吾有身椭盏。
及吾無身,吾有何患吻商?
故貴以身為天下掏颊,若可以寄于天下,愛以身為天下者艾帐,若可托天下乌叶。”[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ù)
-
老子《道德經(jīng)》第十三章涨缚,老子故里,中國鹿邑策治。 ?