learn numpy & pandas 學習筆記2
阿新 • • 發佈:2018-12-15
import numpy as np # A = np.array([1,1,1]) #A是一個序列,並不是個矩陣 # B = np.array([2,2,2]) # print(A) # print(B) # print(np.vstack((A,B))) # vertical stack 垂直方向上合併 # """ # [[1,1,1] # [2,2,2]] # """ # C = np.vstack((A,B)) # print(A.shape,C.shape) # # (3,) (2,3) # D = np.hstack((A,B)) # horizontal stack 水平合併 # print(D) # # [1,1,1,2,2,2] # print(A.shape,D.shape) # # (3,) (6,) # # print(A.T) #這並不能顯示一列三個1 # print(A[np.newaxis,:]) #這句話把A變成一行三列的一個矩陣 # # [[1 1 1]] # print(A[np.newaxis,:].shape) #列印A的矩陣型別 # # (1,3) # print(A[:,np.newaxis]) # 把A變成一個三行一列的矩陣 # """ # [[1] # [1] # [1]] # """ # print(A[:,np.newaxis].shape) #列印A的矩陣型別 # # (3,1) import numpy as np A = np.array([1,1,1])[:,np.newaxis] B = np.array([2,2,2])[:,np.newaxis] # print(A) # # [[1] # # [1] # # [1]] # print(B) # # [[2] # # [2] # # [2]] # C = np.vstack((A,B)) # vertical stack # D = np.hstack((A,B)) # horizontal stack # print(C) # ''' # [[1] # [1] # [1] # [2] # [2] # [2]] # ''' # print(D) # ''' # [[1 2] # [1 2] # [1 2]] # ''' # print(A.shape,C.shape,D.shape) # # (3, 1) (6, 1) (3, 2) C = np.concatenate((A,B,B,A),axis=0) #在列方向合併 print(C) #axis引數很好的控制了矩陣的縱向或是橫向列印,相比較vstack和hstack函式顯得更加方便 ''' [[1] [1] [1] [2] [2] [2] [2] [2] [2] [1] [1] [1]] ''' D = np.concatenate((A,B,B,A),axis=1) #在行方向合併 print(D) ''' [[1 2 2 1] [1 2 2 1] [1 2 2 1]] '''
import numpy as np A = np.arange(12).reshape((3, 4)) # print(A) ''' [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] ''' # print(np.split(A, 2, axis=1)) #縱向均分矩陣 # print(np.split(A, 3, axis=0)) #橫向均分矩陣 # print(np.split(A, 3, axis=1)) #範例的Array只有4列,只能等量對分,因此輸入以上程式程式碼後Python就會報錯 # print(np.array_split(A, 3, axis=1)) #在機器學習時經常會需要將資料做不等量的分割,因此解決辦法為np.array_split() #在Numpy裡還有np.vsplit()與橫np.hsplit()方式可用。 # print(np.vsplit(A, 3)) #等於 print(np.split(A, 3, axis=0)) print(np.hsplit(A, 2)) #等於 print(np.split(A, 2, axis=1))
# Numpy copy & deep copy import numpy as np a = np.arange(4) # array([0, 1, 2, 3]) # b = a # c = a # d = b # #改變a的第一個值,b、c、d的第一個值也會同時改變。 # a[0] = 11 # print(a) # # array([11, 1, 2, 3]) # # 確認b、c、d是否與a相同。 # b is a # True # c is a # True # d is a # True # #同樣更改d的值,a、b、c也會改變。 # d[1:3] = [22, 33] # array([11, 22, 33, 3]) # print(a) # array([11, 22, 33, 3]) # print(b) # array([11, 22, 33, 3]) # print(c) # array([11, 22, 33, 3]) #copy() 的賦值方式沒有關聯性 b = a.copy() # deep copy print(b) # array([11, 22, 33, 3]) a[3] = 44 print(a) # array([11, 22, 33, 44]) print(b) # array([11, 22, 33, 3])
# 如果用 python 的列表和字典來作比較, 那麼可以說 Numpy 是列表形式的,沒有數值標籤,而 Pandas 就是字典形式。Pandas是基於Numpy構建的,讓Numpy為中心的應用變得更加簡單。
#要使用pandas,首先需要了解他主要兩個資料結構:Series和DataFrame。
import pandas as pd
import numpy as np
# s = pd.Series([1,3,6,np.nan,44,1])
# print(s) #Series的字串表現形式為:索引在左邊,值在右邊。由於我們沒有為資料指定索引。於是會自動建立一個0到N-1(N為長度)的整數型索引。
'''
0 1.0
1 3.0
2 6.0
3 NaN
4 44.0
5 1.0
dtype: float64
'''
dates = pd.date_range('20160101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
# print(df)
'''
a b c d
2016-01-01 0.102676 0.427523 -0.680943 1.007115
2016-01-02 -0.773084 0.619988 0.379934 1.172427
2016-01-03 -0.036123 -0.863392 -0.171760 0.890251
2016-01-04 0.517382 -0.155783 -0.738340 1.278619
2016-01-05 -1.647704 -1.505080 -0.243351 0.248558
2016-01-06 -0.386770 1.982197 1.358165 0.101179
'''
'''
DataFrame是一個表格型的資料結構,它包含有一組有序的列,每列可以是不同的值型別(數值,字串,布林值等)。DataFrame既有行索引也有列索引, 它可以被看做由Series組成的大字典。
我們可以根據每一個不同的索引來挑選資料, 比如挑選 b 的元素:
'''
# print(df['b'])
'''
2016-01-01 1.864800
2016-01-02 -2.756416
2016-01-03 -1.185833
2016-01-04 1.399641
2016-01-05 0.966624
2016-01-06 0.617307
Freq: D, Name: b, dtype: float64
'''
#我們在建立一組沒有給定行標籤和列標籤的資料 df1:
# df1 = pd.DataFrame(np.arange(12).reshape((3,4)))
# print(df1)
'''
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
'''
#這樣,他就會採取預設的從0開始 index. 還有一種生成 df 的方法, 如下 df2:
df2 = pd.DataFrame({'A' : 1.,
'B' : pd.Timestamp('20130102'),
'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
'D' : np.array([3] * 4,dtype='int32'),
'E' : pd.Categorical(["test","train","test","train"]),
'F' : 'foo'})
# print(df2)
'''
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
'''
#這種方法能對每一列的資料進行特殊對待. 如果想要檢視資料中的型別, 我們可以用 dtype 這個屬性:
# print(df2.dtypes) #檢視每列的資料型別
'''
A float64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
'''
# print(df2.index) #看行號:
# Int64Index([0, 1, 2, 3], dtype='int64')
# print(df2.columns) #看列的名稱
# Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
# print(df2.values) #看所有df2的值:
'''
[[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'test' 'foo']
[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'train' 'foo']
[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'test' 'foo']
[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'train' 'foo']]
'''
#想知道資料的總結, 可以用 describe():
# df2.describe() #輸出數值型別的常用統計資料
"""
A C D
count 4.0 4.0 4.0
mean 1.0 1.0 3.0
std 0.0 0.0 0.0
min 1.0 1.0 3.0
25% 1.0 1.0 3.0
50% 1.0 1.0 3.0
75% 1.0 1.0 3.0
max 1.0 1.0 3.0
"""
#如果想翻轉資料, transpose:
# print(df2.T) #轉置
'''
0 1 2 \
A 1 1 1
B 2013-01-02 00:00:00 2013-01-02 00:00:00 2013-01-02 00:00:00
C 1 1 1
D 3 3 3
E test train test
F foo foo foo
3
A 1
B 2013-01-02 00:00:00
C 1
D 3
E train
F foo
'''
#如果想對資料的 index 進行排序並輸出:
# print(df2.sort_index(axis=1, ascending=False)) #將列逆序後並輸出
'''
F E D C B A
0 foo test 3 1.0 2013-01-02 1.0
1 foo train 3 1.0 2013-01-02 1.0
2 foo test 3 1.0 2013-01-02 1.0
3 foo train 3 1.0 2013-01-02 1.0
'''
# print(df2.sort_index(axis=0, ascending=False)) #將行逆序後並輸出
'''
A B C D E F
3 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
0 1.0 2013-01-02 1.0 3 test foo
'''
#對資料 值 排序輸出:
print(df2.sort_values(by='E')) #按照E列的數值排序並輸出
'''
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
2 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
3 1.0 2013-01-02 1.0 3 train foo
'''
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6) #生成行號
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
# print(df)
'''
A B C D
2013-01-01 0 1 2 3
2013-01-02 4 5 6 7
2013-01-03 8 9 10 11
2013-01-04 12 13 14 15
2013-01-05 16 17 18 19
2013-01-06 20 21 22 23
'''
# print(df['A'])
# print(df.A) #效果一摸一樣
'''
2013-01-01 0
2013-01-02 4
2013-01-03 8
2013-01-04 12
2013-01-05 16
2013-01-06 20
Freq: D, Name: A, dtype: int64
'''
# print(df[0:3]) #選擇第0,1,2行
'''
A B C D
2013-01-01 0 1 2 3
2013-01-02 4 5 6 7
2013-01-03 8 9 10 11
'''
# print(df['20130102':'20130104']) #選擇第1,2,3行
'''
A B C D
2013-01-02 4 5 6 7
2013-01-03 8 9 10 11
2013-01-04 12 13 14 15
'''
# print(df[3:3]) #df[3:3]是一個空物件
'''
Empty DataFrame
Columns: [A, B, C, D]
Index: []
'''
# loc: select by label
# iloc: select by position
#同樣我們可以使用標籤來選擇資料 loc, 本例子主要通過標籤名字選擇某一行資料, 或者通過選擇某行或者所有行(:代表所有行)然後選其中某一列或幾列資料。
# print(df.loc['20130102']) #輸出這一行的所有列
'''
A 4
B 5
C 6
D 7
Name: 2013-01-02 00:00:00, dtype: int64
'''
# print(df.loc[:,['A','B']]) #輸出A列和B列的所有內容
'''
A B
2013-01-01 0 1
2013-01-02 4 5
2013-01-03 8 9
2013-01-04 12 13
2013-01-05 16 17
2013-01-06 20 21
'''
# print(df.loc['20130102',['A','B']]) #輸出某一行某幾列的內容
'''
A 4
B 5
Name: 2013-01-02 00:00:00, dtype: int64
'''
# print(df.iloc[3,:]) #列印第三行
'''
A 12
B 13
C 14
D 15
Name: 2013-01-04 00:00:00, dtype: int64
'''
# print(df.iloc[3,1]) #列印第三行第一列處的值
# 13
# print(df.iloc[3:5,1:3]) #列印第3,4行,第1,2列的內容,對df進行切片
'''
B C
2013-01-04 13 14
2013-01-05 17 18
'''
# print(df.iloc[[1,3,5],1:3]) #列印第1,3,5行,第1到2列的內容
'''
B C
2013-01-02 5 6
2013-01-04 13 14
2013-01-06 21 22
'''
#當然我們可以採用標籤和位置混合選擇 ix, 其中選擇’A’和’C’的兩列,並選擇前三行的資料
# print(df.ix[:3,['A','C']])
'''
A C
2013-01-01 0 2
2013-01-02 4 6
2013-01-03 8 10
'''
#雖然能執行,但是出現了警告,ix的方式即將被廢棄,請使用loc或者iloc的方式
'''
DeprecationWarning:
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing
'''
#最後我們可以採用判斷指令 (Boolean indexing) 進行選擇. 我們可以約束某項條件然後選擇出當前所有資料.
# print(df[df.A>8]) #列印A列所有大於8的元素所在的行
'''
A B C D
2013-01-04 12 13 14 15
2013-01-05 16 17 18 19
2013-01-06 20 21 22 23
'''