Python3基本工具包:Pandas(1)

作者: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 

1111110101dtype: 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函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章