1. 程式人生 > >learn numpy & pandas 學習筆記2

learn numpy & pandas 學習筆記2



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
'''