数据导入和整理模块---pandas
pandas
- 前言
- (一)、`Series`創建一維數組
- (二)、二維數組表格`DataFrame`的創建與索引的修改
- 一、`DataFrame`的創建
- 1、通過列表來創建
- 2、通過字典創建
- 3、通過二維數組創建
- `DataFrame`索引的修改
- 重命名索引
- (三)、文件的讀取和寫入
- 文件的讀取
- 文件的寫入
- (四)、數據的選取和處理
- 1、數據的選取
- 按列選取數據
- 按行選取數據
- 按區塊選取數據
- 2、數據的篩選
- 3、數據的排序
- 按列排序`sort_values()函數`
- 按行進行排序`sort_index()函數`
- 4、數據的運算
- 5、數據的刪除
- 刪除列
- 刪除行
- 6、數據表的拼接
- `merge()`函數
- 7、`concat()`函數
- 行方向拼接(縱向拼接)
- 橫向拼接
前言
pandas模塊是基于NumPy模塊的一個開源Python模塊,廣泛應用于完成數據快速分析、數據清洗和準備等工作,它的名字來源于“panel data”(面板數據)。
pandas模塊提供了非常直觀的數據結構及強大的數據管理和數據處理功能,某種程度上可以把pandas模塊看成Python版的Excel。如果是利用Anaconda安裝的Python,則自帶pandas模塊,無須單獨安裝。與NumPy模塊相比,pandas模塊更擅長處理二維數據,其主要有Series和DataFrame
兩種數據結構。
(一)、Series創建一維數組
import pandas as pds = pd.Series(['丁一','王二','張三']) print(s)運行結果
0 丁一 1 王二 2 張三 dtype: object看到s是一個一維數組結構,并且每個元素都有一個可以用來定位的行索引,
如s[1]可以定位到王二。
(二)、二維數組表格DataFrame的創建與索引的修改
一、DataFrame的創建
DataFrame 可以通過列表、字典或二維數組來創建。
1、通過列表來創建
利用pandas模塊中的DataFrame()函數來創建
import pandas as pda = pd.DataFrame([[1,2],[3,4],[5,6]]) print(a)運行結果
0 1 0 1 2 1 3 4 2 5 6通過與NumPy模塊創建的二維數組比較可以發現,DataFrame更像Excel中的二維表格,它也有行索引和列索引。需要注意的是,這里的索引序號是從0開始的。
我們還可以在創建DataFrame時自定義列索引和行索引,演示代碼如下:
import pandas as pda = pd.DataFrame([[1,2],[3,4],[5,6]],columns=['date','score'],index=['A','B','C']) print(a)運行結果
date score A 1 2 B 3 4 C 5 6用列表來創建還有另一種方式,演示代碼如下
import pandas as pda = pd.DataFrame() date = [1,3,5] score = [2,4,6] a['date'] = date a['score'] = score print(a)運行結果
date score 0 1 2 1 3 4 2 5 62、通過字典創建
默認以字典的鍵名作為列索引,演示代碼如下:
import pandas as pda = pd.DataFrame({'a':[1,2,3],'b':[4,5,6]},index=['x','y','z']) print(a)運行結果
a b x 1 4 y 2 5 z 3 6如果想以字典的鍵名作為行索引,可以用 from_dict()函數將字典轉換成DataFrame,同時。設置參數orient的值為’index’。演示代碼如下:
import pandas as pda = pd.DataFrame.from_dict({'a':[1,2,3],'b':[4,5,6]},orient='index') print(a)參數orient用于指定以字典的鍵名作為列索引還是行索引,默認值為 'columns 即以字典的鍵名作為列索引,如果設置成Index,則表示以字典的鍵名作為行索引。運行結果如下:
0 1 2 a 1 2 3 b 4 5 63、通過二維數組創建
import pandas as pd import numpy as npa = np.arange(12).reshape(3,4) b = pd.DataFrame(a,index=[1,2,3],columns=['A','B','C','D']) print(b)運行結果
A B C D 1 0 1 2 3 2 4 5 6 7 3 8 9 10 11DataFrame索引的修改
重命名索引
import pandas as pd import numpy as npa = np.arange(12).reshape(3,4) b = pd.DataFrame(a,index=[1,2,3],columns=['A','B','C','D']) b = b.rename(index={1:'萬科',2:'阿里',3:'百度'},columns ={'A':1,'B':2,'C':3,'D':4}) print(b)運行結果
1 2 3 4 萬科 0 1 2 3 阿里 4 5 6 7 百度 8 9 10 11需要注意的是,rename()函數會用新索引名創建一個新的DataFrame,并不會改變b的內容.所以這里將重命名索引之后得到的新DataFrame賦給b,以便在后續代碼中使用。也可以通過設置參數inplace為True來一步到位地完成索引的重命名,代碼如下:
b.rename(index={1:'萬科',2:'阿里',3:'百度'},columns ={'A':1,'B':2,'C':3,'D':4},inplace = True)(三)、文件的讀取和寫入
文件的讀取
以下代碼讀取名為"data.xlsx"的工作簿中的數據。
import pandas as pd data = pd.read_excel('data.xlsx')第2行代碼中為read excel(以函數設置的文件路徑參數是相對路徑,即代碼文件所在的路徑,也可以設置成絕對路徑。read-exce!(3蚤數還有其他參數,這里簡單介紹幾個常用參數:
- sheetname用于指定工作表,可以是工作表名稱,也可以是數字(默認為0,即第1個工作表)。
- encoding用于指定文件的編碼方式,一般設置為UTF-8或GBK編碼,以避免中文亂碼。
- indexLcol用于設置索引列。
例如,要以 UTF?8 編碼方式讀取工作簿“data xlvx”的第1個工作表,則可將第2行代碼修改為如下代碼:
data = pd.read_excel('data.xlsx',sheetname=0,encoding='utf-8')文件的寫入
import pandas as pd import numpy as npa = np.arange(12).reshape(3,4) b = pd.DataFrame(a,index=[1,2,3],columns=['A','B','C','D']) b.to_excel('data.xlsx')如果無法運行:即可安裝openpyxl
運行結果
上圖中,行索引信息被存儲在工作表的第1列中,如果想在寫入數據時不保留行索引信息,可以設置to _ excel()函數的參數。該函數的常用參數有:
- sheetname用于指定工作表名稱。
- index用于指定是否寫入行索引信息,默認為True,即將行索引信息存儲在輸出文件的第1列:若設置為False,則忽略行索引信息。
- columns用于指定要寫入的列。
- encoding用于指定編碼方式。
例如,要將data中的A列數據寫入工作簿并忽略行索引信息,可編寫如下代碼:
(四)、數據的選取和處理
先創建一個數據
import pandas as pd import numpy as np import xlwings as xwdata = pd.DataFrame(np.arange(1,10).reshape(3,3),index=['r1','r2','r3'],columns=['c1','c2','c3'])1、數據的選取
按列選取數據
選取單列
a = data['c1'] print(a)運行結果
r1 1 r2 4 r3 7 Name: c1, dtype: int32看到打印的數據沒有列索引,可以使用如下代碼
a = data[['c1']] print(a)選取多列
c = data[['c1','c2']]按行選取數據
可以根據行序號來選取
#選取2~3行的數據,注意序號從0開始,左閉右開 a = data[1:3] print(a)運行結果
c1 c2 c3 r2 4 5 6 r3 7 8 9不過按上面的方式可能會產生混亂,可以使用iloc方法
#選取2~3行的數據,注意序號從0開始,左閉右開 a = data.iloc[1:3] print(a)如果要選取單行就只能用iloc方法,如選取倒數第一行
a = data.iloc[-1] print(a)還可以使用loc方法根據行的名稱來選取數據
a = data.loc[['r2','r3']] print(a)運行結果
c1 c2 c3 r2 4 5 6 r3 7 8 9如果行數多可以使用head()函數來選取前幾行數據
# 前一行 a = data.head(1) print(a)按區塊選取數據
3.也可以使用ilon或lon同時選取行和列
a = data.iloc[0:2,[0,2]] print(a) #或者 a = data.loc[['r1','r2'],['c1','c3']] print(a)2、數據的篩選
通過在中括號里設定條件可以過濾行。
如,篩選c1列大于1的行
運行結果
c1 c2 c3 r2 4 5 6 r3 7 8 9如果有多個篩選條件,可以用‘&’或‘|’連接起來。注意用小括號將條件括起來
a = data[(data['c1']>1)&(data['c2'] == 5)] print(a)運行結果
c1 c2 c3 r2 4 5 63、數據的排序
按列排序sort_values()函數
例如,將data 按c2列進行降序排列。
a = data.sort_values(by='c2',ascending = False) print(a)運行結果
c1 c2 c3 r3 7 8 9 r2 4 5 6 r1 1 2 3參數by用于指定那一列來排序;參數ascending (上升的意思)默認值為True,表示升序排序,設置為False,表示降序排列。
按行進行排序sort_index()函數
在上排序的基礎上,加上
a = a.sort_index() print(a)運行結果
c1 c2 c3 r1 1 2 3 r2 4 5 6 r3 7 8 94、數據的運算
通過數據運算可以基于已有的列生成新的一列
data = pd.DataFrame(np.arange(1,10).reshape(3,3),index=['r1','r2','r3'],columns=['c1','c2','c3']) data['c4'] = data['c2'] + data['c3'] print(data)運行結果
c1 c2 c3 c4 r1 1 2 3 5 r2 4 5 6 11 r3 7 8 9 175、數據的刪除
使用drop()函數,該函數有以下參數
- index:用于指定刪除的行
- columns:用于指定刪除的列
- inplace:默認值為False,表示不改變原來的,而是返回一個執行刪除操作后返回的新表。
刪除列
a = data.drop(columns = 'c1') print(a)# 刪除多列 a = data.drop(columns = ['c1','c3']) print(a)刪除行
# 刪除多行 a = data.drop(index = ['r1','r3']) print(a) 注意:給出行索引時要輸入行索引名稱而不是序號,除非行索引名就是數字6、數據表的拼接
merge()函數
merge()函數可以根據一個或多個同名的列將不同數據表中的行連接起來
import pandas as pddf1 = pd.DataFrame({'公司':['恒誠','創越','快學'],'分數':[90,95,85]}) df2 = pd.DataFrame({'公司':['恒誠','創越','京西'],'股價':[20,180,30]})df3 = pd.merge(df1,df2) print(df3)運行結果
公司 分數 股價 0 恒誠 90 20 1 創越 95 180可以看到,merge(函數直接根據相同的列名(“公司”列)對兩個數據表進行了合并,而且默認選取的是兩個表共有的列內容(恒盛’、'創銳)。如果同名的列不止一個,可以通過設置參數on指定按照哪一列進行合并,代碼如下:
df3 = pd.merge(df1,df2,on ='公司')默認的合并方式其實是取交集(inner連接》,即選取兩個表共有的內容。如果想取并集(outer)連接),即選取兩個表所有的內容,可以設置參數how,代碼如下:
df3 = pd.merge(df1,df2,how = 'outer') 公司 分數 股價 0 恒誠 90.0 20.0 1 創越 95.0 180.0 2 快學 85.0 NaN 3 京西 NaN 30.0 如果只要左邊的全部內容,how參數為left,右邊則是 right想按行索引合并
df3 = pd.merge(df1,df2,left_index= True,right_index=True) print(df3)運行結果
公司_x 分數 公司_y 股價 0 恒誠 90 恒誠 20 1 創越 95 創越 180 2 快學 85 京西 307、concat()函數
concat()函數使用全連接(UNIONALL)方式完成拼接,它不需要對齊,而是直接進行合并,即不需要兩個表有相同的列或索引,只是把數據整合到一起。因此,該函數沒有參數how和0n。而是用參數axis指定連接的軸向。
行方向拼接(縱向拼接)
df3 = pd.concat([df1,df2]) # df3 = pd.concat([df1,df2],axis = 0) print(df3)運行結果
公司 分數 股價 0 恒誠 90.0 NaN 1 創越 95.0 NaN 2 快學 85.0 NaN 0 恒誠 NaN 20.0 1 創越 NaN 180.0 2 京西 NaN 30.0我們發現索引還是原來的,我們可以設置ignore_index為True來忽略原有的索引。
df3 = pd.concat([df1,df2],ignore_index = True)橫向拼接
df3 = pd.concat([df1,df2],axis = 1)總結
以上是生活随笔為你收集整理的数据导入和整理模块---pandas的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ModuleNotFoundError:
- 下一篇: 数据可视化模块---Matplotlib