python-numpy-pandas

numpy 模塊

numpy屬於第三方庫,須要下載安裝。python

numpy庫有兩個做用:sql

  1. 區別於list列表,提供了數組操做、數組運算、以及統計分佈和簡單的數學模型;
  2. 計算速度快

建立矩陣方法:

import  numpy  as  np  #np是約定俗稱將numpy簡寫

np.array() # 建立矩陣
  • 一維矩陣

一維矩陣就至關於列表數據庫

arr =np.array([1,2,3]) 
print(arr)

[1 2 3]
  • 二維矩陣
arr = np.array([[1,2,3],[1,2,3]])
print(arr)

[[1 2 3]
 [1 2 3]]
  • 三維矩陣
arr = np.array([[[1,2,3],[1,2,3]],[[1,2,3],[1,2,3]]])
print(arr)

[[[1 2 3]
  [1 2 3]]

 [[1 2 3]
  [1 2 3]]]

獲取矩陣的行列數

arr = np.array([[12,23,4],[12,3,4]])
print(arr)

[[12 23  4]
 [12  3  4]]

print(arr.shape) #獲取矩陣的行和列
(2, 3)

print(arr.shape[0]) # 獲取矩陣的行
2

print(arr.shape[1]) # 獲取矩陣的列
3

切割矩陣

切分矩陣相似於列表的切割,可是與列表的切割不一樣的是,矩陣的切割涉及到行和列的切割,可是二者切割的方式都是從索引0開始,而且取頭不取尾。json

arr = np.array([[12,23,4],[10,3,4],[2,4,5]])
print(arr)

print(arr[:,:]) #取全部的元素,:默認全部

print(arr[0,:]) #取第一整行

print(arr[:,0]) # 取第一列

print(arr[1,2]) # 取第二行第三列的值

print(arr[arr>10]) # 取大於10的元素

[[12 23  4]
 [10  3  4]
 [ 2  4  5]]
**************************************************
[[12 23  4]
 [10  3  4]
 [ 2  4  5]] #取全部的元素,:默認全部
**************************************************
[12 23  4]  #取第一整行
**************************************************
[12 10  2]  # 取第一列
**************************************************
4   # 取第二行第三列的值
**************************************************
[12 23]  # 取大於10的元素

矩陣元素替換

矩陣也是一個可變類型的數據,若是對矩陣進行替換操做,會修改矩陣的元素。數組

arr = np.array([[12,23,4],[10,3,4],[2,4,5]])
print(arr)

arr[1,:]=0  # 取值第二行,並讓第二行的元素都爲0
print(arr) 

arr[arr>10] =0  # 取大於10的值,並讓其爲0
print(arr)

[[12 23  4]
 [10  3  4]
 [ 2  4  5]]
**************************************************
[[12 23  4]
 [ 0  0  0]  # 取值第二行,並讓第二行的元素都爲0
 [ 2  4  5]]
**************************************************
[[ 0  0  4]  # 取大於10的值,並讓其爲0
 [10  3  4]
 [ 2  4  5]]

矩陣的合併

arr1 = np.array([[12,23,4],[10,3,4],[2,4,5]])
arr2 = np.array([[11,33,6],[11,7,6],[2,4,5]])
print(arr1)
print('*'*50)
print(arr2)
print('*'*50)
print(np.hstack((arr1,arr2))) # 合併兩個矩陣的行,矩陣應該有相同的行 h表示水平

print(np.vstack((arr1,arr2))) #合併兩個矩陣的列,矩陣應該有相同的列,v表示垂直

print(np.concatenate((arr1,arr2),axis=0)) #axis=0 表示合併兩個矩陣的列,矩陣應該有相同的列,而且axis默認爲0

print(np.concatenate((arr1,arr2),axis=1)) #axis=1 表示合併兩個矩陣的行,矩陣應該有相同的行,axis默認爲0

[[12 23  4]
 [10  3  4]
 [ 2  4  5]]
**************************************************
[[11 33  6]
 [11  7  6]
 [ 2  4  5]]
**************************************************
[[12 23  4 11 33  6]
 [10  3  4 11  7  6]
 [ 2  4  5  2  4  5]]  # 合併兩個矩陣的行,矩陣應該有相同的行 h表示水平
**************************************************
[[12 23  4]
 [10  3  4]
 [ 2  4  5]
 [11 33  6]
 [11  7  6]
 [ 2  4  5]]
**************************************************
[[12 23  4]
 [10  3  4]
 [ 2  4  5]
 [11 33  6]
 [11  7  6]
 [ 2  4  5]]  #axis=0 表示合併兩個矩陣的列,矩陣應該有相同的列,而且axis默認爲0
**************************************************
[[12 23  4 11 33  6]
 [10  3  4 11  7  6]
 [ 2  4  5  2  4  5]] #axis=1 表示合併兩個矩陣的行,矩陣應該有相同的行,axis默認爲0

經過函數建立矩陣

  • arangedom

    arr =np.arange(1,10)  #建立1-9 的數字 一維矩陣
    print(arr)
    
    [1 2 3 4 5 6 7 8 9]
  • linspace/loqspace函數

    print(np.linspace(0,20,6)) # 等差數列 取頭也取尾,取6個數,而且前兩個數之和等於後一個數
    
    [ 0.  4.  8. 12. 16. 20.]
    
    print(np.logspace(0,20,6))  # 等比數列 取6個數
    
    [1.e+00 1.e+04 1.e+08 1.e+12 1.e+16 1.e+20]
  • zeros/ones/eye/emptyspa

    print(np.zeros((3,4))) # 建立 3*4全是0的矩陣
    
    [[0. 0. 0. 0.]
     [0. 0. 0. 0.]
     [0. 0. 0. 0.]]
    
    print(np.ones((3,4))) # 建立3*4 全是1的矩陣
    
    [[1. 1. 1. 1.]
     [1. 1. 1. 1.]
     [1. 1. 1. 1.]]
    
    print(np.eye(3))  # 建立3個主元的單位矩陣
    
    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
    
    print(np.empty((4,4))) # 建立一個4*4的隨機矩陣,裏面的元素是隨機生成的
    
    [[6.23042070e-307 1.42417221e-306 1.37961641e-306 1.24610383e-306]
     [1.69118108e-306 8.06632139e-308 1.20160711e-306 1.69119330e-306]
     [1.78019082e-306 1.78020984e-306 6.23053954e-307 8.06635110e-308]
     [7.56603881e-307 1.78019082e-306 1.78020984e-306 1.60218627e-306]]

矩陣的運算

+   兩個矩陣對應元素相加
-   兩個矩陣對應元素相減
*   兩個矩陣對應元素相乘
/   兩個矩陣對應元素相除,若是都是整數則取商
%   兩個矩陣對應元素相除後取餘數
**n 單個矩陣每一個元素都取n次方,如**2:每一個元素都取平方

pandas模塊

pandas 是python數據分析的核心模塊,它有五大功能:excel

  1. 支持文件存取操做,數據庫(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。
  2. 支持增刪改查、切片、高階函數、分組聚合等單表操做,以及和dict、list的互相轉換。
  3. 支持多表拼接合並操做。
  4. 支持簡單的繪圖操做。
  5. 支持簡單統計分析操做。

series (一維列表)

import numpy as np
import pandas as pd
arr = np.arange(1,10)
print(arr)
s= pd.Series(arr)
print(s)

[1 2 3 4 5 6 7 8 9]
0    1
1    2
2    3
3    4
4    5
5    6
6    7
7    8
8    9
dtype: int32

DataFrame

  • 建立數據列表
import pandas as pd
import numpy as np

# 定義索引(行)的值
dates = pd.date_range('2019-01-01',periods=6)

# 定義矩陣內的值
np.random.seed(1)
arr = 10*np.random.randn(6,4)

# 進行數據表的合併,column--隊列 ,表示列
df = pd.DataFrame(arr,index=dates,columns=['c1','c2','c3','c4'])
print(df)

                c1         c2         c3         c4
2019-01-01  16.243454  -6.117564  -5.281718 -10.729686
2019-01-02   8.654076 -23.015387  17.448118  -7.612069
2019-01-03   3.190391  -2.493704  14.621079 -20.601407
2019-01-04  -3.224172  -3.840544  11.337694 -10.998913
2019-01-05  -1.724282  -8.778584   0.422137   5.828152
2019-01-06 -11.006192  11.447237   9.015907   5.024943
  • 使用pandas讀取字典形式的數據(數組的長度必須相同)

    df2 = pd.DataFrame({'a':1,'b':[2,3],'c':np.arange(2),'d':'hello'})
    print(df2)
    
       a  b  c      d
    0  1  2  0  hello
    1  1  3  1  hello

DataFrame屬性

dtype   查看數據類型
index   查看行序列或者索引
columns 查看各列的標籤
values  查看數據框內的數據,也即不含表頭索引的數據
describe    查看數據每一列的極值,均值,中位數,只可用於數值型數據
transpose   轉置,也可用T來操做
sort_index  排序,可按行或列index排序輸出
sort_values 按數據值來排序
df = pd.DataFrame(arr,index=dates,columns=['c1','c2','c3','c4'])

print(df.dtypes)
print(df.index)
print(df.columns)
print(df.values)

# 查看類型
c1    float64
c2    float64
c3    float64
c4    float64
dtype: object

# 查看索引項
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06'],
              dtype='datetime64[ns]', freq='D')

#查看列
Index(['c1', 'c2', 'c3', 'c4'], dtype='object')

# 查看值
[[ 16.24345364  -6.11756414  -5.28171752 -10.72968622]
 [  8.65407629 -23.01538697  17.44811764  -7.61206901]
 [  3.19039096  -2.49370375  14.62107937 -20.60140709]
 [ -3.22417204  -3.84054355  11.33769442 -10.99891267]
 [ -1.72428208  -8.77858418   0.42213747   5.82815214]
 [-11.00619177  11.4472371    9.01590721   5.02494339]]

查看 每一列的極值,均值,中位數
print(df.describe())

              c1         c2         c3         c4
count   6.000000   6.000000   6.000000   6.000000
mean    2.022213  -5.466424   7.927203  -6.514830
std     9.580084  11.107772   8.707171  10.227641
min   -11.006192 -23.015387  -5.281718 -20.601407
25%    -2.849200  -8.113329   2.570580 -10.931606
50%     0.733054  -4.979054  10.176801  -9.170878
75%     7.288155  -2.830414  13.800233   1.865690
max    16.243454  11.447237  17.448118   5.828152

DataFrame取值

print(df['c2']) # 按列取值

2019-01-01    -6.117564
2019-01-02   -23.015387
2019-01-03    -2.493704
2019-01-04    -3.840544
2019-01-05    -8.778584
2019-01-06    11.447237
Freq: D, Name: c2, dtype: float64
print(df[0:2]) #取第一行和第二行

                   c1         c2         c3         c4
2019-01-01  16.243454  -6.117564  -5.281718 -10.729686
2019-01-02   8.654076 -23.015387  17.448118  -7.612069
  • loc/iloc 自定義取值

    print(df.loc['2019-01-01':'2019-01-03']) # 經過自定義的行標籤選擇數據
    
     c1         c2         c3         c4
    2019-01-01  16.243454  -6.117564  -5.281718 -10.729686
    2019-01-02   8.654076 -23.015387  17.448118  -7.612069
    2019-01-03   3.190391  -2.493704  14.621079 -20.601407
    print(df.iloc[2,1])  # 經過索引取值 == df.values[2,1]
    
    -2.493703754774101
    print(df.iloc[1:4,1:4]) # 行:取第二行到第四行  ; 列:取第二列到第四列
    
                       c2         c3         c4
    2019-01-02 -23.015387  17.448118  -7.612069
    2019-01-03  -2.493704  14.621079 -20.601407
    2019-01-04  -3.840544  11.337694 -10.998913
  • 使用邏輯判斷取值

    print(df[df['c1']>0]) # df['c1']>0 取c1列裏面大於0的值
    
                       c1         c2         c3         c4
    2019-01-01  16.243454  -6.117564  -5.281718 -10.729686
    2019-01-02   8.654076 -23.015387  17.448118  -7.612069
    2019-01-03   3.190391  -2.493704  14.621079 -20.601407

讀取CSV文件

from io import StringIO
import pandas as pd

test_data = '''
5.1,,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,,0.2
7.0,3.2,4.7,1.4
6.4,3.2,4.5,1.5
6.9,3.1,4.9,
,,,
'''

test_data = StringIO(test_data) # 將數據寫入內存
df = pd.read_csv(test_data)
df.columns =['c1','c2','c3','c4']
print(df)


 c1   c2   c3   c4
0  4.9  3.0  1.4  0.2
1  4.7  3.2  NaN  0.2
2  7.0  3.2  4.7  1.4
3  6.4  3.2  4.5  1.5
4  6.9  3.1  4.9  NaN
5  NaN  NaN  NaN  NaN

處理丟失數據

print(df.isnull())

print(df.isnull().sum())  # 經過isnull()方法後使用sum()方法便可得到該數據集某個特徵含有多少個缺失值。

  c1     c2     c3     c4
0  False  False  False  False
1  False  False   True  False
2  False  False  False  False
3  False  False  False  False
4  False  False  False   True
5   True   True   True   True

c1    1
c2    1
c3    2
c4    2
dtype: int64
print(df.dropna(axis=0)) #axis=0會刪除有Nan值的行

    c1   c2   c3   c4
0  4.9  3.0  1.4  0.2
2  7.0  3.2  4.7  1.4
3  6.4  3.2  4.5  1.5
print(df.dropna(axis=1)) #axis=1會刪除有Nan值的列

Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4, 5]
print(df.dropna(how='all')) #刪除全爲NaN值得行或列

c1   c2   c3   c4
0  4.9  3.0  1.4  0.2
1  4.7  3.2  NaN  0.2
2  7.0  3.2  4.7  1.4
3  6.4  3.2  4.5  1.5
4  6.9  3.1  4.9  NaN
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息