進階法寶!掌握這些 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)
輸入與輸出
- 讀取與寫入到 CSV
>>> pd.read_csv('file.csv', header=None, nrows=5)
>>> df.to_csv('myDataFrame.csv')
- 讀取與寫入到 Excel
>>> 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')
- 讀取與寫入到 SQL 查詢或數據庫表中
>>> 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
stack
和unstack
是 python 進行層次化索引的重要操作。
-
Stack: 將數據的列索引轉換爲行索引 (列索引可以簡單理解爲列名)
-
Unstack: 將數據的行索引轉換爲列索引
>>> 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_name 和 value_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() # 檢查索引重複
數據聚合
- groupby
>>> 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})
- 轉換 Transformation
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") # 使用其他值替換缺失值
數據合併
- Merge
>>> 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
join
方法提供了一個簡便的方法用於將兩個 DataFrame 中的不同的列索引合併成爲一個 DataFrame。
其中參數的意義與 merge 方法基本相同, 只是 join 方法默認爲左外連接 how=left。
>>> data1.join(data2, how='right')
- Concatenate
# 垂直拼接
>>> 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')
可視化
- Series 可視化
>>> import matplotlib.pyplot as plt
>> s.plot()
>>> plt.show()
>>> df2.plot()
>>> plt.show()
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/LrVsBBeNnj5OUqYcymzPXQ