Python模块之Pandas模块学习笔记
目錄
一、模塊的安裝
二、數據結構
1. DataFrame的創建
2. DataFrame索引的修改
3. DataFrame數據信息查看
三、文件的讀取和寫入
1. 讀取
2. 寫入
四、 數據的選取和處理
1. 數據的選取
2. 數據的處理
3. 數據的拼接(增加行、列)
4. 數據的統計分析
5. 數據的匯總? ?
一、模塊的安裝
1. 安裝pandas
pip instal pandas
2. 安裝openpyxl
pip instal openpyxl
二、數據結構
pandas模塊更擅長處理二維數據,主要有series和dataframe兩種數據結構。
series創建一維數組,不僅包含數值,還包含一組索引。
dataframe通過列表、字典或二維數組創建,包含行索引和列索引。
?在此主要記錄DataFrame的使用,包括:
- 創建
- 修改索引?
- DataFrame數據信息的查看
1. DataFrame的創建
- 通過二維列表創建
- 通過字典創建
- 通過NumPy模塊創建的二維數組創建DataFrame
(1)創建空列表
????????df=df.DataFrame()
(2) 通過列表創建
????????a=pd.DataFrame([[1,2], [3,4]]) ?# 用二維列表創建2行2列的二維數組
????????還可以在創建時自定義行索引和列索引。
? ? ? ? a=pd.DataFrame([[1,2], [3,4]],columns=['data','score'],index=['a','b']) ?# columns指定列索引,index指定行索引。
(3)通過字典創建
????????a=pd.DataFrame({'a': [1,3,5],'b': [2,4,6]}, index=['x', 'y', 'z']) ?# 創建a,b列,xyz行的二維數組。如果想以字典的鍵名作為行索引,可以用from_dict()函數將字典轉換成DataFrame,同時設置參數orient的值為‘index’。
????????c=pd.DataFrame.from_dict({'a': [1,3,5],'b': [2,4,6]}, orient='index')
(4)通過NumPy模塊創建的二維數組創建DataFrame
????????a = np.arange(12).reshape(3, 4)
????????b = pd.DataFrame(a, index=[1,2,3], columns=['a', 'b', 'c', 'd'])??
2. DataFrame索引的修改
(1)a.index.name="Com"
(2)重命名索引rename()
????????rename()函數會用新索引創建一個新的DataFrame,不會改變原值。通過設置參數inplace為True來修改原值。
????????a.rename(index={'a':'萬科', 'b':'阿里', 'c':'百度'}, inplace=True) ?#更改行索引名稱? ?
????????a.rename(columns={'1':'分數', '2':'排名'}, inplace=True) ?#更改列索引名稱
(3)行索引轉換為常規列
????????a=a.reset_index() ?# 設置參數inplace=True,可以一步到位的修改
(4)重新調整列順序
? ? ? ? df=df.reindex(columns=new_col_name)
(5)設置索引列
????????a=a.set_index['id',inplace=True] #將id列設為索引列
3. DataFrame數據信息查看
(1)df.shape ?#維度查看
(2)df.info() ?#數據表基本信息(維度、列名稱、數據格式、所占空間等)
(3)df.dtypes ?#每一列數據的格式
? ? ? ? df['A1'].dtype ?#某一列數據的格式
(4)df.isnull() ?#查看所有列是否為空值
? ? ? ? df['A1'].isnull() ?#查看某一列是否為空值
(5)df['A1'].unique ?#查看某一列的唯一值
(6)df.values ?#查看數據表的值
? ? ? ? 注:帶.values輸出的是np數組。不帶.values則輸出的是DataFrame類型**
(7)df.columns ?#查看列名稱
? ? ? ? df.columns.values ?#查看列名稱,并輸出值(輸出的是一個np數組)。
(8)df.index ?#查看行索引名稱
? ? ? ? df.index.values ?#查看列名稱,并輸出值(輸出的是一個np數組)。當進行循環遍歷時,兩者一樣。
(9)df.head() ?#默認輸出前5行
????????df.tail() ?#默認輸出后5行
(10)print(data.describe()) ?#描述性統計
三、文件的讀取和寫入
1. 讀取
? ? ? ? data=pd.read_excel('data.xlsx') ?# 需要安裝openpyxl模塊?? ??? ??????????
df = pd.read_excel(r"/Users/andy/Downloads/books.xlsx", skiprows=3, usecols="C:F", index_col=None, sheet_name = 0, dtype = {"ID":str, "InStore":str)#文件的路徑使用"r", 主要是為了避免路徑出錯#skiprows表示忽略前面XX行. 例如上面的例子, 讀取的時候直接忽略了前面3行#usecols 表示讀取哪幾列, 可以使用列表的方式表示要導入哪幾列, 例如usecols = [0,2]#sheet_name 用于指定讀取哪個工作表#index_col表示使用哪一列作為索引#header=0, 可以使用header表示使用哪一行作為列索引#dtype使用字典, 更改對應的Series的數據類型. 一般轉化成str, 便于后期的運算或修改df = pd.read_excel("/Users/andy/Downloads/books.xlsx", skiprows=3, usecols="C:F", index_col=None, sheet_name = 0, dtype = {"ID":str, "InStore":str})for i in df.index:df["ID"].at[i] = 1 + idf["InStore"].at[i] = "YES" if i % 2 == 0 else "NO"df["ID"] = df["ID"].astype("str").str.zfill(3)#在上面的例子中, ID這一列我使用了zfill()這個方法, 它會自動的讓字符前面自動添加0. 這里要注意的是, 只能為字符串添加zfill(), 所以我這里進行了數據類型的轉化. #讀取文件的時候, 使用了dtype參數, 主要是為了將對應的列轉化為字符串, 便于我們進行填充排序 #skiprows表示忽略哪幾行, usecols表示要導入哪些列, 可以使用列表的方式導入指定的列, 例如usecols = [0,3], 也可以按上面的方法?????????data=pd.read_csv('data.csv', delimiter=',', encoding='utf-8')
? ? ? ? ?#delimiter指定csv文件的數據分隔符;encoding指定文件的編碼方式;index_col用于設置索引。
? ? ? ? ?#注意:讀取excle時不能指定編碼encoding,讀取csv文件時可以指定?? ?
2. 寫入
????????data.to_excel('data.xlsx', sheet_name=0, columns=['A列'], index=False)
? ? ? ? sheet_name指定工作表的名成; index指定是否寫入行索引信息;columns指定要寫入的列;encoding指定編碼方式。
四、 數據的選取和處理
1. 數據的選取
**使用切片操作時,遵循左閉右開規則。先行后列,中間用逗號(,)分隔。**
(1)按行選取
data.iloc[1:3] data.loc[['r2', 'r3']] ?# 根據行的名稱來選取。列表中嵌套一個行列表。 data.head() ?# 用head函數選取前幾行(2)按區塊選取
a=data.iloc[0:2][['r1','r3' ]] a=data.iloc[0:2, [0,2]] ?# 讀取0-1行,0和2列。loc方法使用字符串作為索引,iloc方法使用數字作為索引; a=data.iloc[0:44, 0:5] ?# 讀取0-44行,0-5列。第0行0列為索引行和索引列 a=data.iloc[0:5, 11:12] ?# 讀取第0-5行,第12列(索引號為11)。 a=data.iloc[[0,2],[0,2]] ?#按位置單獨提取數據????????讀取指定不連續的多行多列,需要在列表中嵌套列表
(3)使用ix按索引標簽和位置混合提取數據
????????df_inner.ix[:'2018-01-03',:4] ?# 將日期設為行索引,提取2018/1/3以前,前4列的數據
2. 數據的處理
(1)數據的篩選提取
a = data[data['c1']>1] ? # c1列大于1的行。多個篩選條件,用”&“(表示’且‘)或”|“(表示’或‘)連接。 data[data['c1'].str[-1].values=='年']|data['c1'].str[-1]=='月'] ? #按照c1列字符串最后一個字是年或月篩選 df.loc[(df['age']>20)&(df_inner['city']=='beijing'),['id','gender']] ?#行篩選,提取id、gender列 df.iloc[:5].iloc[df['c1']==2] #篩選前5行中c1列=2的行。(2)數據的排序? ?
? ? ?-按值排序
? ? ?a=data.sort_values(by='c2', ascending=False) ?# by指定按哪一列排序;ascending(“上升”的意思)默認為True,升序;False表示降序
? ? ?-按索引排序
? ? ?a=a.sort_index() ?# 按索引列排序
? ? ?data.sort_index(axis=0,ascending=False) ?#降序排列行索引
? ? ?data.sort_index(axis=1,ascending=False) ?#降序排列列索引
(3)數據的運算
? ? ?通過數據運算可以基于已有的列生成新的一列
? ? ?data['c4']=data['c3']-data['c1']
? ? ?df.loc[(df_inner['city']=='beijing')].city.count() ?#對篩選后的數據按city列進行計數
? ? ?df[(df['city']=='beijing')].price.sum() ?#對篩選后的結果按price進行求和
?(4)數據的判斷
? ? ?df['city'].isin(['beijing']) ?#判斷city列是否包含beijing
? ? ?df_inner.loc[df_inner['city'].isin(['beijing','shanghai'])] ?#判斷city列里是否包含beijing和shanghai,然后將符合條件的數據提取出來
?(5)轉置
????????df.T ? ?
?(6)數據的修改、替換和填加 ? ??
? ? ?-數據的修改
? ? ?scores["ID"][1] ="1006" ?#數據的修改
? ? ?df.ix[['ID']=='shanghai', 'Scores']='90' ?#數據的修改。先選取,后賦值。
? ???-數據的替換
? ? ?df['city'].replace('shagnhai','sh') ?#數據替換
? ? ?-數據的添加
? ? ?scores["df1"]= scores["Scores"]//10 ?#添加一列df1,數據為Scores列除以10的商整數
? ? ?scores["df2"]= scores["Scores"]>85 ?#添加一列df2,數據為True或False
? ? ?df['group']=np.where(df_inner['price']>3000,'high','low') ?#添加一列,根據‘price’列的值來填
? ? ?注:增加行列還可以使用數據的拼接函數。插入列見下方數據的拼接。
?(7)數據的刪除
? ? ?pop()和drop()函數可以刪除DataFrame中的指定數據。
? ? ?data.pop('b3')
? ? ?drop([],axis=0,inplace) ?#axis=0指定刪除行,axis=1指定刪除列;index指定要刪除的行;columns指定要刪除的列;inplace默認為False,表示刪除操作不改變原DataFrame。
? ? ?df.drop([0,1,3,6]) ?#刪除指定行,第1,2,4,7行的數據
? ? ?df.drop(['A1','D1'], axis=1) #刪除指定列。
? ? ?不論是刪除行還是刪除列,都可以通過drop方法實現,只需要設定好刪除的軸即可,即調整drop方法中的axis參數。默認該參數為0,表示刪除行。如果需要刪除列變量,則需設置為1。
??????drop_duplicate():去除重復項。
# 語法格式 DataFrame.drop_duplicates(subset=None, keep='first', inplace=False) #subset : column label or sequence of labels, optional #用來指定特定的列,默認所有列 #keep : {‘first’, ‘last’, False}, default ‘first’ #刪除重復項并保留第一次出現的項 #inplace : boolean, default False 是直接在原來數據上修改還是保留一個副本data.drop_duplicates(subset='Num',keep='first',inplace=True) newdf=data.drop_duplicates()? ? ?del df ?#刪除整個df數據
(8)數據缺失值的處理
? ? ?對于缺失值的存在可能會影響到后期的數據分析或挖掘工作,那么我們該如何處理這些缺失值呢?常用的有三大類方法,即刪除法、填補法和插值法。
? ? ?刪除法:當數據中的某個變量大部分值都是缺失值,可以考慮刪除改變量;當缺失值是隨機分布的,且缺失的數量并不是很多是,也可以刪除這些缺失的觀測。
? ? ?替補法:對于連續型變量,如果變量的分布近似或就是正態分布的話,可以用均值替代那些缺失值;如果變量是有偏的,可以使用中位數來代替那些缺失值;對于離散型變量,我們一般用眾數去替換那些存在缺失的觀測。
? ? ?插補法:插補法是基于蒙特卡洛模擬法,結合線性模型、廣義線性模型、決策樹等方法計算出來的預測值替換缺失值。
?????-刪除法
? ? ?df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) ?#刪除缺失值
? ? ?how : {'any', 'all'}
? ? ?any : if any NA values are present, drop that label
? ? ?all : if all values are NA, drop that label
? ? ?df['A1'].drop_duplicates() ?#刪除后出現的重復值
? ? ?df['A1'].drop_duplicates(keep='last') ?#刪除先出現的重復值,保留后出現的
? ? ?通過del命令實現,該命令可以刪除Python的所有對象。
? ? ?-替補法
? ? ?df.fillna() ?#填充空值?
? ? ?df.fillna(values=0) ?#用數字0填充空值
? ? ?df['A'].fillna(df['A1'].mean()) ?#用A1列的均值填充空值
? ? ?采用前項填充或后項填充
? ? ?df.fillna(method='ffill') ?#采用前項填充
? ? ?df.fillna(method='bfill') ?#采用后項填充
(9)df['A1'].map(str.strip) ?#對某一列數據中的字符串進行strip處理
(10)df['A1'].str.lower() ?#對某一列數據中的字符串進行大小寫轉換
(11)df['A1'].astype('float') ?#對某一列數據中的數據進行數據類型轉換
(12)df.loc[(df['city']=='beijing')&(df['price']>100),'sign']=1 ?#對復合多個條件的數據進行分組標記
(13)split=pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size']) ?#對category字段的值依次進行**分列**,并創建新的DataFrame數據表,索引值為df_inner的索引列,列名稱為category和size
(14)pd.DataFrame(category.str[:3]) ?#提取前三個字符,并生成數據表
(15)對DataFrame使用函數
? ? ?def multiply(x):
? ? ?????????return x * 2
? ? ?df["height"].**apply**(multiply)
3. 數據的拼接(增加行、列)
? ? ?-merge()函數
? ? ?-concat()函數
? ? ?-append()函數?? ?
?(1)merge()函數
?????根據一個或多個同名的列將不同數據表中的行連接起來。
? ? ?df3 = pd.merge(df1,df2, on='公司', how='outer')
? ? ?on指定按照哪一同名列進行合并;how=outer指取并集連接。how=left指保留左表全部內容,而對右表不太在意;how=right指保留右表全部內容,而對左表不太在意;
? ? ?df3 = pd.merge(df1,df2,left_index=True, right_index=True) ?# 按照行索引進行合并
(2)concat()函數
????????使用全連接方式完成拼接,不需要對齊,而是直接進行合并。用參數axis指定連接的軸向,默認為0,即按行方向連接(縱向拼接)
????????df3 = pd.concat([df1, df2], axis=0, ignore_index=True) ?#忽略原有索引,生成新的數字序列作為索引。?
(3)append()函數
????????實現的是縱向拼接。
????????df3 = df1.append(df2)
????????另一個用途是新增元素。新增元素時,一定要設置參數ignore_index=True來忽略原索引,否則會報錯。
????????df3 = df1.append({'公司':'騰飛', '分數': '90'}, ignore_index=True)
(4)增加一行
#在0行前增加一行 df.loc[-1]=list df.index=df.index+1 df=df.sort_index()#在最后一行增加一行 size=df.index.size df.loc[siez]=list(5) 插入一列
#方法一: df.insert(1,'要增加的列的列名',list) #直接使用insert方法插入列,需要同時插入值#方法二: df_col_name=df.columns.tolist() #先取出所有列名到一個列表中 df_col_name.insert(2,'aa') #在列名的列表中插入要增加的列名 df=df.reindex(columns=df_col_name) #將重設列名為新的列名。用這種方法不需要同時輸入該列的值4. 數據的統計分析
????????pandas模塊為我們提供了非常多的描述性統計分析的指標函數,如總和、均值、最小值、最大值等,我們來具體看看這些函數:
????????首先隨機生成三組數據
????????np.random.seed(1234)
????????d1 = pd.Series(2*np.random.normal(size = 100)+3)
? ? ? ? d2 = np.random.f(2,4,size = 100)
????????d3 = np.random.randint(1,100,size = 100)
????????d1.count() #非空元素計算
????????d1.min() #最小值
????????d1.max() #最大值
????????d1.idxmin() #最小值的位置,類似于R中的which.min函數
????????d1.idxmax() #最大值的位置,類似于R中的which.max函數
????????d1.quantile(0.1) #10%分位數
????????d1.sum() #求和
????????d1.mean() #均值
????????d1.median() #中位數
????????d1.mode() #眾數
????????d1.var() #方差
????????d1.std() #標準差
????????d1.mad() #平均絕對偏差
????????d1.skew() #偏度
????????d1.kurt() #峰度
????????d1.describe() #一次性輸出多個描述性統計指標。必須注意的是,descirbe方法只能針對序列或數據框,一維數組是沒有這個方法的
? ? 這里自定義一個函數,將這些統計描述指標全部匯總到一起:
def stats(x):return pd.Series([x.count(),x.min(),x.idxmin(),x.quantile(.25),x.median(),x.quantile(.75),x.mean(),x.max(),x.idxmax(),x.mad(),x.var(),x.std(),x.skew(),x.kurt()],index = ['Count','Min','Whicn_Min','Q1','Median','Q3','Mean','Max','Which_Max','Mad','Var','Std','Skew','Kurt'])stats(d1)????????在實際的工作中,我們可能需要處理的是一系列的數值型數據框,如何將這個函數應用到數據框中的每一列呢?可以使用apply函數。
????????將之前創建的d1,d2,d3數據構建數據框:
????????非常完美,就這樣很簡單的創建了數值型數據的統計性描述。如果是離散型數據呢?就不能用這個統計口徑了,我們需要統計離散變量的觀測數、唯一值個數、眾數水平及個數。你只需要使用describe方法就可以實現這樣的統計了。
????????除以上的簡單描述性統計之外,還提供了連續變量的相關系數(corr)和協方差矩陣(cov)的求解,這個跟R語言是一致的用法。
????????df.corr():關于相關系數的計算可以調用pearson方法或kendell方法或spearman方法,默認使用pearson方法。
????????df.corr('spearman')
? ? 如果只想關注某一個變量與其余變量的相關系數的話,可以使用corrwith,如下方只關心x1與其余變量的相關系數:df.corrwith(df['x1'])
????????df.cov():數值型變量間的協方差矩陣
5. 數據的匯總? ?
????????主要函數是groupby和pivote_table。 ? ??
????????-**數據聚合:groupby()函數**
? ? ?聚合:pandas模塊中可以通過groupby()函數實現數據的聚合操作
(1)對所有的列進行計數匯總
df_inner.groupby('city').count() ?#根據city分組,對其它列進行統計 student.groupby('Sex').mean() ?#根據性別分組,對其它列求平均值(2)按城市對id字段進行計數
df_inner.groupby('city')['id'].count()(3)groupby還可以使用多個分組變量,例如對兩個字段進行匯總計數
df_inner.groupby(['city','size'])['id'].count() student.groupby(['Age','Sex']).mean() ? #根據年齡、性別分組,對其它列求平均值(4)對city字段進行匯總,并分別計算price的合計和均值
df_inner.groupby('city')['price'].agg([len,np.sum,np.mean])?-**數據透視表 pivote_table函數**
????????pandas為我們提供了非常強大的函數pivot_table(),該函數就是實現數據透視表功能的。我們先看看這個函數的語法和參數:
????????pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='All')
? ? ? ? data:需要進行數據透視表操作的數據框
????????values:指定需要聚合的字段
????????index:指定某些原始變量作為行索引
????????columns:指定哪些離散的分組變量
????????aggfunc:指定相應的聚合函數
????????fill_value:使用一個常數替代缺失值,默認不替換
????????margins:是否進行行或列的匯總,默認不匯總
????????dropna:默認所有觀測為缺失的列
????????margins_name:默認行匯總或列匯總的名稱為'All'?
? ? 例1:對一個分組變量(Sex),一個數值變量(Height)作統計匯總
????????pd.pivot_table(student, values=['Height'], columns=['Sex'])
? ? 例2:對一個分組變量(Sex),兩個數值變量(Height,Weight)作統計匯總
????????pd.pivot_table(student, values=['Height','Weight'], columns=['Sex'])
? ? 例3:對兩個分組變量(Sex,Age),兩個數值變量(Height,Weight)作統計匯總
????????pd.pivot_table(student, values=['Height','Weight'], columns=['Sex','Age'])
? ? 這樣的結果并不像Excel中預期的那樣,該如何變成列聯表的形式的?很簡單,只需將結果進行非堆疊操作(unstack)即可: ?pd.pivot_table(student, values=['Height','Weight'], columns=['Sex','Age']).unstack()
參考文章:
python之pandas用法大全 - 我不叫鬧心 - 博客園
Pandas學習筆記詳版
Python數據分析之pandas學習_weixin_30763455的博客-CSDN博客
總結
以上是生活随笔為你收集整理的Python模块之Pandas模块学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏行业如何上云?阿里云架构师解读四大主
- 下一篇: Python基于OpenCV的实时疲劳检