進階法寶!掌握這些 NumPy - Pandas 方法,快速提升數據處理效率

Pandas 是基於 NumPy 的一種工具,該工具是爲解決數據分析任務而創建的。pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。pandas 提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,它是使 python 成爲強大而高效的數據分析環境的重要因素之一。

NumPy


NumPy 庫是 Python 中用於科學計算的核心庫。它提供了一個高性能的多維數組對象,以及用於處理這些數組的工具。

導入 Numpy

import numpy as np

創建 Arrays

>>> a = np.array([1,2,3])
>>> b = np.array([(1.5,2,3)(4,5,6)]dtype = float)
>>> c = np.array([[(1.5,2,3)(4,5,6)][(3,2,1)(4,5,6)]],dtype = float)
# 創建一個由0組成的數組
>>> np.zeros((3,4)) 
# 創建一個1的數組
>>> np.ones((2,3,4),dtype=np.int16) 
# 創建一個等距值數組(步長值)
>>> d = np.arange(10,25,5) 
# 創建一個等距值數組(樣本數)
>>> np.linspace(0,2,9) 
# 創建一個常量數組
>>> e = np.full((2,2),7) 
# 創建一個2X2單位矩陣
>>> f = np.eye(2) 
# 創建一個隨機值的數組
>>> np.random.random((2,2)) 
# 創建一個空數組
>>> np.empty((3,2))

輸入與輸出

>>> np.save('my_array', a)
>>> np.savez('array.npz', a, b)
>>> np.load('my_array.npy')
>>> np.loadtxt("myfile.txt")
>>> np.genfromtxt("my_file.csv"delimiter=',')
>>> np.savetxt("myarray.txt", a, delimiter=" ")

數據類型

>>> np.int64   # 有符號64位整數類型
>>> np.float32 # 標準雙精度浮點數
>>> np.complex # 由128個浮點數表示的複數
>>> np.bool    # 布爾類型,存儲TRUE和FALSE值
>>> np.object  # Python對象類型
>>> np.string_ # 固定長度的字符串類型
>>> np.unicode_# 固定長度的unicode類型

查看數組

>>> a.shape    # 陣列尺寸
>>> len(a)     # 數組的長度
>>> b.ndim     # 陣列維數
>>> e.size     # 數組元素數
>>> b.dtype    # 數組元素的數據類型
>>> b.dtype.name  # 數據類型名稱
>>> b.astype(int) # 將數組轉換爲不同類型

獲取幫助

>>> np.info(np.ndarray.dtype)

Array 算術運算

>>> g = a - b        # 減法
array([[-0.5, 0. , 0. ],
    [-3. , -3. , -3. ]]) 
>>> np.subtract(a,b) # 減法
>>> b + a            # 加法
array([[ 2.5, 4. , 6. ],
    [ 5. , 7. , 9. ]]) 
>>> np.add(b,a)      # 加法
>>> a / b            # 除法
array([[ 0.66666667, 1. ,  1. ],
        0.25       , 0.4,  0.5])
>>> a * b            # 乘法
array([[ 1.5, 4.  , 9.  ],
    [ 4. , 10. , 18. ]]) 
>>> np.multiply(a,b) # 乘法
>>> np.divide(a,b)   # 除法
>>> np.exp(b)  # 求冪
>>> np.sqrt(b) # 平方根
>>> np.sin(a)  # 輸出一個數組的正弦值
>>> np.cos(b)  # 輸出一個數組的餘弦值
>>> np.log(a)  # 輸出一個數組的自然對數
>>> e.dot(f)   # 點積
array([[ 7., 7.][ 7., 7.]])

比較大小

>>> a == b  # 數組元素比較
array([[False, True, True],
    [False, False, False]]dtype=bool) 
>>> a < 2   # 數組元素比較
array([True, False, False]dtype=bool) 
>>> np.array_equal(a, b) # 數組比較

統計函數

>>> a.sum()    # 數組求和
>>> a.min()    # 數組最小值
>>> b.max(axis=0)    # 數組行最大值
>>> b.cumsum(axis=1) # 元素均值的累積和
>>> a.mean()     # 中位數
>>> b.median()   # 相關係數
>>> a.corrcoef() # 相關係數
>>> np.std(b)    # 標準偏差

數組拷貝

>>> h = a.view() # 使用相同的數據創建數組的視圖
>>> np.copy(a)   # 創建數組的副本
>>> h = a.copy() # 創建數組的深層副本

數組排序

>>> a.sort()       # 排序數組
>>> c.sort(axis=0) # 對數組橫軸的元素進行排序

切片與索引

>>> a[2]   # 選擇第二個索引處的元素
3
>>> b[1,2] # 選擇第1行第2列的元素(相當於b[1][2])
1.5 2 3 6.0 456
>>> a[0:2]  # 選擇索引0和1的項
array([1, 2]) 
>>> b[0:2,1] # 選擇第1列中第0行和第1行中的項目
array([ 2., 5.])
>>> b[:1]  # 選擇第0行中的所有項目,等價於b[0:1,:]
array([[1.5, 2., 3.]])
>>> c[1,...]  # 與[1,:,:]一樣
array([[[3., 2., 1.],
    [4., 5., 6.]]])
>>> a[ : :-1]  # 逆轉了數組
array([3, 2, 1])
>>> a[a<2]  # 從小於2的a中選擇元素
array([1])
>>> b[[1, 0, 1, 0],[0, 1, 2, 0]] # 選擇元素(1,0),(0,1),(1,2) 和 (0,0)
array([4.,2.,6.,1.5])
>>> b[[1, 0, 1, 0]][:,[0,1,2,0]] # 選擇矩陣的行和列的子集
array([[4.,5.,6.,4.], 
       [1.5,2.,3.,1.5], 
       [4.,5.,6.,4.],
       [1.5,2.,3.,1.5]])

數組操作

>>> i = np.transpose(b) # 交換數組維度
>>> i.T
>>> b.ravel()       # 將數組壓平
>>> g.reshape(3,-2) # 不會改變數據
>>> h.resize((2,6))    # 返回一個具有形狀(2,6)的新數組
>>> np.append(h,g)     # 向數組添加項
>>> np.insert(a, 1, 5) # 在數組中插入項
>>> np.delete(a,[1])   # 從數組中刪除項
>>> np.concatenate((a,d),axis=0)# 連接數組
array([ 1, 2, 3, 10, 15, 20])
>>> np.vstack((a,b))      # 垂直(行)堆疊陣列
array([[ 1. , 2. , 3. ], 
       [ 1.5, 2. , 3. ],
       [ 4. , 5. , 6. ]]) 
>>> np.r_[e,f]            # 垂直(行)堆疊陣列
>>> np.hstack((e,f))      # 水平(列)堆疊陣列
array([[ 7., 7., 1., 0.],
       [ 7., 7., 0., 1.]]) 
>>> np.column_stack((a,d))# 創建堆疊的列陣列
array([[ 1, 10], 
       [ 2, 15],
       [ 3, 20]])
>>> np.c_[a,d]           # 創建堆疊的列陣列
>>> np.hsplit(a,3)  # 在第3個索引處水平分割數組
[array([1]),array([2]),array([3])]
>>> np.vsplit(c,2)  # 在第二個索引處垂直分割數組
[array([[[ 1.5, 2. , 1. ],
         [ 4. , 5. , 6. ]]]), 
 array([[[ 3., 2., 3.],
         [ 4., 5., 6.]]])]

Pandas


Pandas 庫建立在 NumPy 上,併爲 Python 編程語言提供了易於使用的數據結構和數據分析工具。

導入 Pandas

>>> import pandas as pd

Series

>>> s = pd.Series([3,5,-7,9]index=['A''B''C''D'])

DataFrame

>>> data = {'Country'['Belgium''India''Brazil'],
            'Capital'['Brussels''New Delhi''Brasília'],
            'Population'[11190846, 1303171035, 207847528]}
>>> df = pd.DataFrame(data,
                     columns=['Country''Capital''Population'])

獲取幫助信息

>>> help(pd.Series.loc)

切片與索引

>>> s['b'] # 獲取一個元素
-5
>>> df[1:] # 獲取DataFrame子表
    Country   Capital     Population
  1   India   New Delhi   1303171035
  2  Brazil   Brasília    207847528
# 通過位置
>>> df.iloc[[0],[0]]  # 按行和列選擇單個值
'Belgium'
>>> df.iat([0],[0])   
'Belgium'
# 通過標籤
>>> df.loc[[0]['Country']] # 通過行和列標籤選擇單個值
'Belgium'
>>> df.at([0]['Country'])  
'Belgium'
# 通過標籤或位置
>>> df.ix[2]            # 選擇行子集中的單行
Country    Brazil 
Capital    Brasília 
Population 207847528
>>> df.ix[:,'Capital']  # 選擇列子集中的單列
0 Brussels
1 New Delhi
2 Brasília
>>> df.ix[1,'Capital']  # 選擇行和列
'New Delhi'
# 布爾索引
>>> s[~(s > 1)]           # 選擇Series s的值不大於1的子集
>>> s[(s < -1) | (s > 2)] # 選擇Seriess的值是<-1或>2 的子集
>>> df[df['Population']>1200000000] # 使用過濾器來調整數據框
# 設置
>>> s['a'] = 6 # 將Series s的索引a設爲6

Dropping

>>> s.drop(['a''c']) # 從行刪除值 (axis=0) 
>>> df.drop('Country'axis=1) # 從列刪除值

Sort & Rank

>>> df.sort_index() # 按軸上的標籤排序 
>>> df.sort_values(by='Country') # 按軸上的值排序
>>> df.rank()

檢索 Series / DataFrame 上的信息

>>> df.shape   # (行、列)
>>> df.index   # 描述指數
>>> df.columns # 描述DataFrame列
>>> df.info()  # DataFrame信息
>>> df.count() # 非空值的個數
>>> df.sum()          # 值的總和
>>> df.cumsum()       # 值的累積和
>>> df.min()/df.max() # 最小/最大值
>>> df.idxmin()/df.idxmax() # 最小/最大索引值
>>> df.describe()# 摘要統計信息
>>> df.mean()    # 值的意思
>>> df.median()  # 中位數的值

Apply 函數

>>> f = lambda x: x*2
>>> df.apply(f)        # Apply函數
>>> df.applymap(f)     # Apply每個元素

數據一致性

在不重疊的索引中引入NA

>>> s3 = pd.Series([7, -2, 3]index=['a''c''d'])
>>> s + s3
a 10.0 
b NaN 
c 5.0 
d 7.0

你也可以在fill方法的幫助做內部數據一致

>>> s.add(s3, fill_value=0) 
a 10.0
b -5.0
c 5.0
d 7.0
>>> s.sub(s3, fill_value=2) 
>>> s.div(s3, fill_value=4) 
>>> s.mul(s3, fill_value=3)

輸入與輸出

>>> pd.read_csv('file.csv'header=None, nrows=5) 
>>> df.to_csv('myDataFrame.csv')
>>> pd.read_excel('file.xlsx')
>>> pd.to_excel('dir/myDataFrame.xlsx'sheet_name='Sheet1')
# 從同一個文件中讀取多個工作表
>>> xlsx = pd.ExcelFile('file.xls')
>>> df = pd.read_excel(xlsx, 'Sheet1')
>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:')
>>> pd.read_sql("SELECT * FROM my_table;", engine)
>>> pd.read_sql_table('my_table', engine)
>>> pd.read_sql_query("SELECT * FROM my_table;", engine)

>>> pd.to_sql('myDf', engine)

read_sql()read_sql_table()read_sql_query()到一個便捷的封裝。

數據透視Pivot

# 將行展開成列
>>> df3= df2.pivot(index='Date',
                   columns='Type',
                   values='Value')

數據透視表Pivot_table

# 將行展開成列
>>> df4 = pd.pivot_table(df2, 
                         values='Value',
                         index='Date',
                         columns=['Type'])

堆疊 stack/unstack

stackunstackpython 進行層次化索引的重要操作。

>>> stacked = df5.stack()
>>> stacked.unstack()

pandas.melt(frame, 
            id_vars=None, 
            value_vars=None, 
            var_name=None, 
            value_name='value', 
            col_level=None)

frame:
要處理的數據集。

id_vars:
不需要被轉換的列名。

value_vars:
需要轉換的列名,如果剩下的列全部都要轉換,就不用寫了。

var_namevalue_name:
是自定義設置對應的列名。

col_level :
如果列是 MultiIndex,則使用此級別。

寬數據 --->> 長數據,有點像用excel做透視跟逆透視的過程。

>>> pd.melt(df2,
            id_vars=["Date"],
            value_vars=["Type""Value"],
            value_)

迭代

# (Column-index, Series) 對
>>> df.iteritems() 
# (Row-index, Series) 對
>>> df.iterrows()

高級索引

# 按條件選擇
>>> df3.loc[:,(df3>1).any()]       # 選擇只要有變量大於1的列
>>> df3.loc[:,(df3>1).all()]       # 選擇所有變量大於1的列
>>> df3.loc[:,df3.isnull().any()]  # 選擇帶NaN的列
>>> df3.loc[:,df3.notnull().all()] # 選擇不帶NaN的列
# 用isin索引選擇
>>> df[(df.Country.isin(df2.Type))] # 找到相同的元素
>>> df3.filter(items=["a","b"])     # 過濾值
>>> df.select(lambda x: not x%5)    # 選擇特定的元素
# Where
>>> s.where(s > 0)  # 滿足條件的子集的數據
# Query
>>> df6.query('second > first')  # 查詢DataFrame

設置與重置索引

>>> df.set_index('Country')  # 設置索引
>>> df4 = df.reset_index()   # 重置索引
# DataFrame重命名
>>> df = df.rename(index=str,columns={"Country":"cntry", 
                                      "Capital":"cptl", 
                                      "Population":"ppltn"})

重建索引

>>> s2 = s.reindex(['a','c','d','e','b'])
>> df.reindex(range(4),
              method='ffill')
Country Capital Population 
0 Belgium Brussels 11190846 
1 India New Delhi 1303171035 
2 Brazil Brasília 207847528 
3 Brazil Brasília 207847528
>>> s3 = s.reindex(range(5), 
                   method='ffill')
0  3 
1  3 
2  3 
3  3 
4  3

多重索引

>>> arrays = [np.array([1,2,3]),
              np.array([5,4,3])]
>>> df5 = pd.DataFrame(np.random.rand(3, 2)index=arrays)
>>> tuples = list(zip(*arrays))
>>> index = pd.MultiIndex.from_tuples(tuples,
                                      names=['first''second'])
>>> df6 = pd.DataFrame(np.random.rand(3, 2)index=index)
>>> df2.set_index(["Date""Type"])

數據去重

>>> s3.unique()            # 返回唯一的值
>>> df2.duplicated('Type') # 檢查特定列重複的
>>> df2.drop_duplicates('Type', 
                        keep='last') # 去重
>>> df.index.duplicated()  # 檢查索引重複

數據聚合

>>> df2.groupby(by=['Date','Type']).mean()
>>> df4.groupby(level=0).sum()
>>> df4.groupby(level=0).agg({'a':lambda x:sum(x)/len(x),
                              'b': np.sum})

transform⽅法,它與apply很像,但是對使⽤的函數有⼀定限制:

>>> customSum = lambda x: (x+x%2)
>>> df4.groupby(level=0).transform(customSum)

缺失值處理

>>> df.dropna()           # 刪除缺失值
>>> df3.fillna(df3.mean())# 用特定的值填充NaN值
>>> df2.replace("a""f") # 使用其他值替換缺失值

數據合併

>>> pd.merge(data1,
             data2,
             how='left',
             on='X1')

>>> pd.merge(data1,
             data2,
             how='right',
             on='X1')

>>> pd.merge(data1,
             data2,
             how='inner',
             on='X1')

>>> pd.merge(data1,
             data2,
             how='outer',
             on='X1')

join方法提供了一個簡便的方法用於將兩個 DataFrame 中的不同的列索引合併成爲一個 DataFrame。

其中參數的意義與 merge 方法基本相同, 只是 join 方法默認爲左外連接 how=left。

>>> data1.join(data2, how='right')
# 垂直拼接
>>> s.append(s2)
# 水平或垂直拼接
>>> pd.concat([s,s2],axis=1, keys=['One','Two'])
>>> pd.concat([data1, data2]axis=1, join='inner')

日期

>>> df2['Date']= pd.to_datetime(df2['Date'])
>>> df2['Date']= pd.date_range('2000-1-1',
                               freq='M')
>>> dates = [datetime(2012,5,1), datetime(2012,5,2)]
>>> index = pd.DatetimeIndex(dates)
>>> index = pd.date_range(datetime(2012,2,1), end, freq='BM')

可視化

>>> import matplotlib.pyplot as plt
>> s.plot()
>>> plt.show()

>>> df2.plot()
>>> plt.show()

-- 數據 STUDIO --

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/LrVsBBeNnj5OUqYcymzPXQ