1建立數據對象sql
Pandas最經常使用的數據對象是數據框(DataFrame)和Series。數據框與R中的DataFrame格式相似,都是一個二維數組。Series則是一個一維數組,相似於列表。數據框是Pandas中最經常使用的數據組織方式和對象。有關更多數據文件的讀取將在第三章介紹,本節介紹從對象和文件建立數據框的方式,具體如表1所示。數組
表1 Pandas建立數據對象app
方法函數 |
用途spa |
示例excel |
示例說明對象 |
read_table排序 read_csv索引 read_excel內存 |
從文件建立數據框 |
In: import pandas as pd In: data1 = pd.read_table('table_data.txt',sep=';') |
讀取table_data.txt文件,數據分隔符是; |
DataFrame.from_dict DataFrame.from_items DataFrame.from_records |
從其餘對象例如Series、Numpy數組、字典建立數據框 |
In: data_dict = {'col1': [2, 1, 0], 'col2': ['a', 'b', 'a'], 'col3': [True, True, False]} In: data2 = pd.DataFrame.from_dict(data_dict) |
基於字典建立數據框,列名爲字典的3個key,每一列的值爲key對應的value值 |
2 查看數據信息
查看信息經常使用方法包括對整體概況、描述性統計信息、數據類型和數據樣本的查看,具體如表2所示:
表2 Pandas經常使用查看數據信息方法彙總
方法 |
用途 |
示例 |
示例說明 |
info |
查看數據框的索引和列的類型、費控設置和內存用量信息。 |
In: print(data2.info()) Out: <class 'pandas.core.frame.DataFrame'> RangeIndex: 3 entries, 0 to 2 Data columns (total 3 columns): col1 3 non-null int64 col2 3 non-null object col3 3 non-null bool dtypes: bool(1), int64(1), object(1) memory usage: 131.0+ bytes None |
返回對象的全部信息 |
describe |
顯示描述性統計數據,包括集中趨勢、分散趨勢、形狀等。 |
In: print(data2.describe()) Out: col1 count 3.0 mean 1.0 std 1.0 min 0.0 25% 0.5 50% 1.0 75% 1.5 max 2.0 |
默認查看數值型列,使用include= 'all'查看全部類型數據 |
dtype |
查看數據框每一列的數據類型 |
In: print(data2.dtypes) Out: col1 int64 col2 object col3 bool dtype: objectt |
結果是Series類型 |
head |
查看前N條結果 |
In: print(data2.head(2)) Out: col1 col2 col3 0 2 a True 1 1 b True |
從第一行開始取前2行 |
tail |
查看後N條結果 |
In: print(data2.tail(2)) Out: col1 col2 col3 1 1 b True 2 0 a False |
從最後一行開始取後2行 |
index |
查看索引 |
In: print(data2.index) Out: RangeIndex(start=0, stop=3, step=1) |
結果是一個類列表的對象,可用列表方法操做對象 |
columns |
查看列名 |
In: print(data2.columns) Out: Index(['col1', 'col2', 'col3'], dtype='object') |
|
shape |
查看形狀,記錄有多少行多少列 |
In: print(data2.shape) Out: (3,3) |
形狀爲元組類型 |
isnull |
查看每一個值是否爲空值 |
In: print(data2.isnull()) Out: col1 col2 col3 0 False False False 1 False False False 2 False False False |
數據中沒有空值,所以都是False |
unique |
查看特定列的惟一值 |
In: print(data2['col2'].unique()) Out: ['a' 'b'] |
查看col2列的惟一值 |
注意 在上述查看方法中,除了info方法外,其餘方法返回的對象均可以直接賦值給變量,而後基於變量對象作二次處理。例如能夠從dtype的返回值中僅獲取類型爲bool的列。
3 數據切片和切塊
數據切片和切塊是使用不一樣的列或索引切分數據,實現從數據中獲取特定子集的方式。常見的數據切片和切換的方式如表3所示:
表3 Pandas經常使用數據切分方法
方法 |
用途 |
示例 |
示例說明 |
[['列名1', '列名2',…]] |
按列名選擇單列或多列 |
In: print(data2[['col1','col2']]) Out: col1 col2 0 2 a 1 1 b 2 0 a |
選擇data2的col1和col3兩列 |
[m:n] |
選擇行索引在m到n間的記錄 |
In: print(data2[0:2]) Out: col1 col2 col3 0 2 a True 1 1 b True |
選取行索引在[0:2)中間的記錄,不包含2 |
iloc[m:n] |
In: print(data2.iloc[0:2]) Out: col1 col2 col3 0 2 a True 1 1 b True |
||
iloc[m:n,j:k] |
選擇行索引在m到n且列索引在j到k間的記錄 |
In: print(data2.iloc[0:2,0:1]) Out: col1 0 2 1 1 |
選取行索引在[0:2)列索引在[0:1)中間的記錄,行索引不包含2,列索引不包含1 |
loc[m:n,[ '列名1', '列名2',…]] |
選擇行索引在m到n間且列名爲列名一、列名2的記錄 |
In: print(data2.loc[0:2,['col1','col2']]) Out: col1 col2 0 2 a 1 1 b 2 0 a |
選取行索引在[0:2)之間,列名爲'col1'和'col2'的記錄,行索引不包含2 |
提示 若是選擇特定索引的數據,直接寫索引值便可。例如data2.loc[2,['col1','col2']]爲選擇第三行且列名爲'col1'和'col2'的記錄。
4 數據篩選和過濾
數據篩選和過濾是基於條件的數據選擇,本章2.6.3提到的比較運算符都能用於數據的篩選和選擇條件,不一樣的條件間的邏輯不能直接用and、or來實現且、或的邏輯,而是要用&和|實現。經常使用方法如表4所示:
表4 Pandas經常使用數據篩選和過濾方法
方法 |
用途 |
示例 |
示例說明 |
單列單條件 |
以單獨列爲基礎選擇符合條件的數據 |
In: print(data2[data2['col3']==True]) Out: col1 col2 col3 0 2 a True 1 1 b True |
選擇col3中值爲True的全部記錄 |
多列單條件 |
以全部的列爲基礎選擇符合條件的數據 |
In: print(data2[data2=='a']) Out: col1 col2 col3 0 NaN a NaN 1 NaN NaN NaN 2 NaN a NaN |
選擇全部值爲a的數據 |
使用「且」進行選擇 |
多個篩選條件,且多個條件的邏輯爲「且」,用&表示 |
In: print(data2[(data2['col2']=='a') & (data2['col3']==True)]) Out: col1 col2 col3 0 2 a True |
選擇col2中值爲a且col3值爲True的記錄 |
使用「或」進行選擇 |
多個篩選條件,且多個條件的邏輯爲「或」,用|表示 |
In: print(data2[(data2['col2']=='a') | (data2['col3']==True)]) Out: col1 col2 col3 0 2 a True 1 1 b True 2 0 a False |
選擇col2中值爲a或col3值爲True的記錄 |
使用isin查找範圍 |
基於特定值的範圍的數據查找 |
In: print(data2[data2['col1'].isin([1,2])]) Out: col1 col2 col3 0 2 a True 1 1 b True |
篩選col1列值爲1或2的記錄 |
query |
按照相似sql的規則篩選數據 |
In: print(data2.query('col2=="b"')) Out: col1 col2 col3 1 1 b 1 |
篩選數據中col2值爲b的記錄 |
5 數據預處理操做
Pandas的數據預處理基於整個數據框或Series實現,整個預處理工做包含衆多項目,本節列出經過Pandas實現的場景功能。本節功能具體如表5所示:
表5 Pandas經常使用預處理方法
方法 |
用途 |
示例 |
示例說明 |
T |
轉置數據框,行和列轉換 |
In: print(data2.T) Out: 0 1 2 col1 2 1 0 col2 a b a |
行索引、列名以及數據相互調換 |
sort_values |
按值排序,默認爲正序,可經過ascending=False指定倒序排序 |
In: print(data2.sort_values(['col1'])) Out: col1 col2 2 0 a 1 1 b 0 2 a |
按colo1列排序 |
sort_index |
按索引排序,默認爲正序,可經過ascending=False指定倒序排序 |
In: print( data2.sort_index(ascending=False)) Out: col1 col2 col3 2 0 a 0 1 1 b 1 0 2 a 1 |
按索引倒序排序 |
dropna |
去掉缺失值,可經過axis設置爲0或 index、1或columns丟棄帶有缺失值的行或列 |
In: print(data2.dropna()) Out: col1 col2 col3 0 2 a True 1 1 b True 2 0 a False |
直接丟棄帶有缺失值的行 |
fillna |
填充缺失值,可設置爲固定值以及不一樣的填充方法 |
In: print(data2.fillna(method='bfill')) Out: col1 col2 col3 0 2 a True 1 1 b True 2 0 a False |
使用下一個有效記錄填充缺失值 |
astype |
轉換特定列的類型 |
In: data2['col3'] = data2['col3'].astype(int) In: print(data2.dtypes) Out: col1 int64 col2 object col3 int32 dtype: object |
將col3轉換爲int型 |
rename |
更新列名 |
In: print(data2.rename(columns= Out: A B C 0 2 a 1 1 1 b 1 2 0 a 0 |
將data2的列名更新爲A、B、C |
drop_duplicates |
去重重複項,經過指定列設置去重的參照 |
In: print(data2.drop_duplicates(['col3'])) Out: col1 col2 col3 0 2 a 1 2 0 a 0 |
按col3列去重重複記錄 |
replace |
查找替換 |
In: print(data2.replace('a','A')) Out: col1 col2 col3 0 2 A 1 1 1 b 1 2 0 A 0 |
將小寫字符a替換爲大些字母A |
sample |
抽樣 |
In: print(data2.sample(n=2)) Out: col1 col2 col3 0 2 a 1 1 1 b 1 |
從data2中隨機抽取2條數據 |
6 數據合併和匹配
數據合併和匹配是將多個數據框作合併或匹配操做。具體實現如表6所示:
表6 Pandas經常使用數據合併和匹配方法
方法 |
用途 |
示例 |
示例說明 |
merge |
關聯並匹配兩個數據框 |
In: print(data2.merge(data1,on='col1',how='inner')) Out: col1 col2_x col3_x col2_y col3_y col4 0 1 b 1 2 3 4 |
關聯data1和data2,主鍵分別爲a列和col1列,內關聯方式 |
concat |
合併兩個數據框,可按行或列合併 |
In: print(pd.concat((data1,data2),axis=1)) Out: col1 col2 col3 col4 col1 col2 col3 0 1 2 3 4 2 a 1 1 6 7 8 9 1 b 1 2 11 12 13 14 0 a 0 |
按列合併data1和data2,可經過指定axis=0按行合併 |
append |
按行追加數據框 |
In: print(data1.append(data2)) Out: col1 col2 col3 col4 0 1 2 3 4.0 1 6 7 8 9.0 2 11 12 13 14.0 0 2 a 1 NaN 1 1 b 1 NaN 2 0 a 0 NaN |
將data2追加到data,等價於pd.concat((data1,data2), |
join |
關聯並匹配兩個數據框 |
In: print(data1.join(data2,lsuffix='_d1', rsuffix='_d2')) Out: col1_d1 col2_d1 col3_d1 col4 col1_d2 col2_d2 col3_d2 0 1 2 3 4 2 a 1 1 6 7 8 9 1 b 1 2 11 12 13 14 0 a 0 |
將data1和data2關聯,設置關聯後的列名前綴分別爲d1和d2 |
7 數據分類彙總
數據分類匯與Excel中的概念和功能相似。具體實現如表7所示:
表7 Pandas經常使用數據分類彙總方法
方法 |
用途 |
示例 |
示例說明 |
groupby |
按指定的列作分類彙總 |
In: print(data2.groupby(['col2'])['col1'].sum()) Out: col2 a 2 b 1 Name: col1, dtype: int64 |
以col2列爲維度,以col1列爲指標求和 |
pivot_table |
創建數據透視表視圖 |
In: print(pd.pivot_table(data2,index=['col2'])) Out: col1 col3 col2 a 1 0.5 b 1 1.0 Name: col1, dtype: int64 |
以col2列爲索引創建數據透視表,默認計算方式爲求均值 |
8 高級函數使用
Pandas能直接實現數據框級別高級函數的應用,而不用寫循環遍歷每條記錄甚至每一個值後作計算,這種方式能極大提高計算效率,具體如表8所示:
表8 Pandas經常使用高級函數
方法 |
用途 |
示例 |
示例說明 |
map |
將一個函數或匿名函數應用到Series或數據框的特定列 |
In: print(data2['col3'].map(lambda x:x*2)) Out: 0 2 1 2 2 0 Name: col3, dtype: int64 |
對data2的col3的每一個值乘2 |
apply |
將一個函數或匿名函數應用到Series或數據框 |
In: print(data2.apply(pd.np.cumsum)) Out: col1 col2 col3 0 2 a 1 1 3 ab 2 2 3 aba 2 |
將data2的全部列按行(默認)作累加 |
agg |
一次性對多個列作聚合操做
|
In: import numpy as np In: print(data2.groupby(['col2']).agg( Out: col1 col3 col2 a 2 0.5 b 1 1.0 |
在data2中以col2爲維度,對col1求和,col3求均值 |