作者:xxw9485
時間:2018/3/10
來源:http://mp.weixin.qq.com/s/pm8503plIouWGAtS3zAM5Q
Pandas
pandas 是基於NumPy的一種工具,該工具是爲了解決數據分析任務而創建的。Pandas納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。
1、序列
序列(Series)可以理解成是R語言中的向量,Python中的列表、元組的高級版本。因爲序列具有更好的廣播效應,既可以與一個標量進行運算,又可以進行元素級函數的計算。而列表不能與標量進行運算,也不能用於元素級的數學函數。
實例:
# 輸入:
a = [1,2,3] # 創建列表a
print(a + 10)
# 輸出:
TypeError: can only concatenate list (not "int") to list
# 輸入:
pow(a,2)
# 輸出:
TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
# 輸入:
import pandas as pd
a = [1,2,3] # 創建列表a
b = pd.Series(a) # 將列表a轉換爲序列
b + 10
# 輸出:
0 11
1 12
2 13
dtype: int64
# 輸入:
pow(b,2)
# 輸出:
0 1
1 4
2 9
dtype: int64
除了上面介紹序列功能,再來說說其他序列常用的場景,如序列的索引、成員關係、去重、排序、計數、抽樣、統計運算等。
1.1 序列的索引
類似列表的索引方法:
# 輸入:
import numpy as np
import pandas as pd
np.random.seed(1)
a = pd.Series(np.random.randint(size=5,low=1,high=10))
print(a,'\n')
print(a[0],'\n') # 取第一個元素
print(a[1:3],'\n') # 取第二、第三個元素
print(a[::2],'\n') # 依次取數,步長爲2
# 輸出:
0 6
1 9
2 6
3 1
4 1
dtype: int32
6
1 9
2 6
dtype: int32
0 6
2 6
4 1
dtype: int32
iat方法:該方法不管應用於序列還是數據框都非常優秀,主要體現在簡介而高速。
# 輸入:
import numpy as np
import pandas as pd
np.random.seed(1)
a = pd.Series(np.random.randint(size=5,low=1,high=10))
print(a,'\n')
print(a.iat[-3],'\n') # 取倒數第三個元素
# 輸出:
0 6
1 9
2 6
3 1
4 1
dtype: int32
6
布爾索引:
# 輸入:
import numpy as np
import pandas as pd
np.random.seed(1)
a = pd.Series(np.random.randint(size=5,low=1,high=100))
print(a,'\n')
print(a[a>=20]) # 取出大於等於20的值
print(a[a>=20][a<=70]) # 取出20到70之間的值
# 輸出:
0 38
1 13
2 73
3 10
4 76
dtype: int32
0 38
2 73
4 76
dtype: int32
0 38
dtype: int32
1.2 序列的成員關係
在R語言中一個向量的元素是否包含於另一個向量,可以使用in函數進行判斷,同理,Python中也有類似的方法。對於一個一維數組,in1d函數實現該功能;對於一個序列,isin方法可實現該功能。numpy模塊中的in1d函數也可以用於序列的成員關係的比較。
注意:in1d函數第三個是數字1不是字母l。
# 輸入:
import numpy as np
import pandas as pd
a = pd.Series([1,2,3,4])
b = pd.Series([10,2,3,40])
print(np.in1d(a,b),'\n')
print(a.isin(b),'\n')
c = np.array(['q','w','e','r'])
d = np.array(['q','a','w','s'])
print(np.in1d(c,d))
# 輸出:
[False True True False]
0 False
1 True
2 True
3 False
dtype: bool
[ True True False False]
1.3 序列的去重和水平統計
如果手中有一離散變量的序列,想查看該序列都有哪些水平,以及各個水平的頻次,則可以藉助於unique函數(與R語言一樣的函數)實現序列的去重,獲得不同的水平值;通過使用value_counts函數(對應於R語言的table函數)對各個水平進行計數,並按頻次降序呈現。
# 輸入:
import numpy as np
import pandas as pd
np.random.seed(10)
a = np.random.randint(size = 1000, low = 1, high = 4)
print(pd.unique(a),'\n') # 去重
print(pd.value_counts(a)) # 水平統計
# 輸出:
[2 1 3]
3 342
2 334
1 324
dtype: int64
1.4 序列的排序
對某個序列進行升序或降序排序,注意:排序函數默認升序。
# 輸入:
import numpy as np
import pandas as pd
np.random.seed(10)
a = pd.Series(np.random.normal(size = 4))
print(a.sort_index(ascending = False),'\n') # 按索引降序排列
print(a.sort_values()) # 按序列的實際值升序排列
# 輸出:
3 -0.008384
2 -1.545400
1 0.715279
0 1.331587
dtype: float64
2 -1.545400
3 -0.008384
1 0.715279
0 1.331587
dtype: float64
1.5 序列的抽樣
抽樣也是數據分析中常用的方法,通過從總體中抽取出一定量的樣本來推斷總體水平;或者通過抽樣將數據拆分成兩部分,一部分建模,一部分測試。pandas模塊提供了sample函數(與R語言的sample函數一致)幫我們完成抽樣的任務。
語法如下:
s.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
其中,n:指定抽取的樣本量;
frac:指定抽取的樣本比例;
replace:是否有放回抽樣,默認無放回;
weights:指定樣本抽中的概率,默認等概論抽樣;
random_state:指定抽樣的隨機種子;
# 輸入:
import pandas as pd
a = pd.Series(range(1,101)) # 從1到100隨機抽取3個數
print(a.sample(n = 3, random_state = 2),'\n')
b = pd.Series(range(1,6)) # 從1到5有放回的抽取3個值
print(b.sample(n = 3, replace = True, random_state = 2),'\n')
c = pd.Series(['男','女']) # 從男、女中不等概率的抽取10個樣本
print(c.sample(n = 10, replace = True, weights = [0.2,0.8],random_state = 3))
# 輸出:
83 84
30 31
56 57
dtype: int32
0 1
0 1
3 4
dtype: int32
1 女
1 女
1 女
1 女
1 女
1 女
0 男
1 女
0 男
1 女
dtype: object
1.6 序列的統計運算
pandas模塊提供了比numpy模塊更豐富的統計運算函數,而且還提供了類似於R語言中的summary彙總函數,即describe函數。
# 輸入:
import numpy as np
import pandas as pd
np.random.seed(10)
a = pd.Series(np.random.randint(size = 1000, low = 1, high = 101))
a.describe()
# 輸出:
count 1000.000000
mean 50.406000
std 29.465834
min 1.000000
25% 24.000000
50% 50.000000
75% 76.000000
max 100.000000
dtype: float64
其中count是序列中非缺失元素的個數。哦,對了,如何判斷一個序列元素是否爲缺失呢?可以使用isnull函數,等同於R語言中的is.na函數。
# 輸入:
import numpy as np
import pandas as pd
a = pd.Series([1,2,np.nan,4,np.nan,6])
print(a,'\n')
print(a.isnull())
# 輸出:
0 1.0
1 2.0
2 NaN
3 4.0
4 NaN
5 6.0
dtype: float64
0 False
1 False
2 True
3 False
4 True
5 False
dtype: bool
除此,我們再來羅列一些常用的統計函數:
a.min() # 最小值
a.quantile(q=[0,0.25,0.5,0.75,1]) # 分位數函數
a.median() # 中位數
a.mode() # 衆數
a.mean() # 平均值
a.mad() # 平均絕對誤差
a.max # 最大值
a.sum() # 和
a.std() # 標準差
a.var() # 方差
a.skew() # 偏度
a.kurtosis() # 峯度
a.cumsum() # 和的累計,返回序列
a.cumprod() # 乘積的累積,返回序列
a.product() # 序列元素乘積
a.diff() # 序列差異(微分),返回序列
a.abs() # 絕對值,返回序列
a.pct_change() # 百分比變化 ,返回序列
a.corr(s2) # 相關係數
a.ptp() # 極差 R中的range函數