Python—实训day8—掌握DataFrame的常用操作
2掌握DataFrame的常用操作
2.1基礎屬性
detail.columns #列名 detail.index #索引/行名 detail.shape #形狀 detail.dtypes #類型2.2查改增刪DataFrame數據
2.2.1查看訪問DataFrame中的數據
(1)對單列數據的訪問
DataFrame的單列數據為一個Series。根據DataFrame的定義可以知曉DataFrame是一個帶有標簽的二維數組,每個標簽相當每一列的列名。
有以下兩種方式來實現對單列數據的訪問:
①以字典訪問某一個key的值的方式使用對應的列名,實現單列數據的訪問。
②以屬性的方式,實現單列數據的訪問。(不建議使用,易引起混淆)
(2)訪問某一列的某幾行
訪問DataFrame中某一列的某幾行時,單獨一列的DataFrame可以視為一個Series,而訪問一個Series中的某幾行基本和訪問一個一維的ndarray相同。
比如:data['字段名'][:2]
(3)訪問多列數據
訪問DataFrame多列數據可以將多個列索引名稱視為一個列表。
比如:data[['字段名1','字段名2','字段名3']]
(4)對某幾行訪問
如果只是需要訪問DataFrame某幾行數據的實現方式則和上述的訪問多列多行相似,選擇所有列,使用“:”代替即可。
比如:data[:][:2]
head和tail也可以得到多行數據,但是用這兩種方法得到的數據都是從開始或者末尾獲取的連續數據。默認參數為訪問5行,只要在方法后方的“()”中填入訪問行數即可實現目標行數的查看。
比如:data.head() # 訪問data數據的前5行
data.tail() # 訪問data數據的后5行
#--單列數據訪問 ##第一種方式:以字典形式訪問 detail['order_id'] ##第二種方式:以屬性形式訪問(不建議使用,易混淆) detail.order_id#--對某一列的某幾行訪問 detail['order_id'][:4]#--對多列數據訪問 detail[['detail_id', 'order_id', 'dishes_id']]#--對某幾行訪問(所有列多行) detail[:][:4]detail.head(4) #得到的數據都是從開始獲取的連續數據,默認訪問前5行數據 detail.tail(3) #得到的數據都是從末尾獲取的連續數據,默認訪問的是最后5行數據(5)loc方法是針對DataFrame行索引名稱進行索引。利用loc方法,能夠實現所有單層索引切片操作。在loc使用的時候內部傳入的行索引名稱如果為一個區間,則前后均為閉區間,loc內部還可以傳入表達式,結果會返回滿足表達式的所有值。
loc方法使用方法如下:
DataFrame.loc[行索引名稱或條件, 列索引名稱]
比如:data.loc[:2,['字段名1','字段名2','字段名3']] #loc方法:行標簽索引
(6)iloc方法使用時內部傳入的行索引位置或列索引位置為區間時,則為前閉后開區間。iloc方法的使用方法如下。
DataFrame.iloc[行索引位置, 列索引位置]
比如:data.iloc[:2,[0,3,5]] # iloc方法:行號索引
iloc和loc區別是iloc接收的必須是行索引和列索引的位置。
#--loc方法:DataFrame.loc[行索引名稱或條件, 列索引名稱] detail.loc[:4, 'order_id'] #左閉右閉,此處提取出來的是前5行數據 detail.loc[:3, ['detail_id', 'order_id', 'dishes_id']] detail.loc[detail['order_id'] == 417, :] #條件提取,此處提取order_id等于417的全部數據#--iloc方法:DataFrame.iloc[行索引位置, 列索引位置] detail.iloc[:5, 1]2.2.2更新修改DataFrame中的數據
更改DataFrame中的數據,原理是將這部分數據提取出來,重新賦值為新的數據。
需要注意的是,數據更改直接針對DataFrame原數據更改,操作無法撤銷,如果做出更改,需要對更改條件做確認或對數據進行備份。
比如:data.loc[2,'字段名1'] = 3000
detail.loc[detail['order_id'] == 417, 'order_id'] = 417002.2.3為DataFrame增添數據
DataFrame添加一列的方法非常簡單,只需要新建一個列索引,并對該索引下的數據進行賦值操作即可。
新增的一列值是相同的則直接賦值一個常量即可。
比如:data['字段名1'] = 列表
data['新字段名'] = 常數
#添加新列“price” detail['price'] = detail['counts'] * detail['amounts']detail['test'] = 5 #新增的一列值是相同的則直接賦值一個常量即可2.2.4刪除某列或某行數據
刪除某列或某行數據需要用到pandas提供的方法drop,drop方法的用法如下:
drop(labels, axis=0, level=None, inplace=False, errors='raise')
axis為0時表示刪除行,axis為1時表示刪除列。(x軸有變動過,axis設為1;y軸有變動的,axis設為0)
常用參數如下所示。
detail.drop('test', axis=1, inplace=True) #要對原始數據生效需要設置inplace=True2.3描述性統計
2.3.1數值型特征的描述性統計
(1)數值型特征的描述性統計——NumPy中的描述性統計函數
數值型數據的描述性統計主要包括了計算數值型數據的完整情況、最小值、均值、中位數、最大值、四分位數、極差、標準差、方差、協方差和變異系數等。在NumPy庫中一些常用的統計學函數如下表所示。
pandas庫基于NumPy,自然也可以用這些函數對數據框進行描述性統計。
(2)數值型特征的描述性統計—— pandas描述性統計方法
pandas還提供了更加便利的方法來計算均值 ,如detail['amounts'].mean()。
pandas還提供了一個方法叫作describe,能夠一次性得出數據框所有數值型特征的非空值數目、均值、四分位數、標準差。
detail['amounts'].mean() #均值 detail['amounts'].max() #最大值 detail['amounts'].median() #中位數detail.describe() #一次性得出數據框所有數值型特征2.3.2類別型特征的描述性統計
描述類別型特征的分布狀況,可以使用頻數統計表。pandas庫中實現頻數統計的方法為value_counts。
pandas提供了categories類,可以使用astype方法將目標特征的數據類型轉換為category類別。
describe方法除了支持傳統數值型以外,還能夠支持對category類型的數據進行描述性統計,四個統計量分別為列非空元素的數目,類別的數目,數目最多的類別,數目最多類別的數目。
detail['dishes_name'].value_counts() #頻數統計#轉變為category類型的數據,之后即可使用describe()進行描述性統計 detail['dishes_name'] = detail['dishes_name'].astype('category') detail['dishes_name'].describe()3轉換與處理時間序列數據
數據分析的分析對象不僅僅限于數值型和類別型兩種,常用的數據類型還包括了時間類型。通過時間類型數據能夠獲取到對應的年月日和星期等信息。但時間類型數據在讀入Python后常常以字符串形式出現,無法實現大部分與時間相關的分析。pandas庫繼承了numpy庫的datetime64以及timedelta64模塊,能夠快速地實現時間字符串的轉換、信息提取和時間運算。
在多數情況下,對時間類型數據進行分析的前提就是將原本為字符串的時間轉換為標準時間類型。pandas繼承了NumPy庫和datetime庫的時間相關模塊,提供了6種時間相關的類。
Timestamp:時間戳,只能表示1677-2262年的時間。如 pd.Timestamp('2016-07-10 10:10')。
Period:固定周期,如 pd.Period('2016-01')
Timedelta:時間間隔,如 pd.Timedelta('1 day')
3.1轉換字符串時間為標準時間
3.1.1timestampe類型
Timestamp作為時間類中最基礎的,也是最為常用的。在多數情況下,時間相關的字符串都會轉換成為Timestamp。pandas提供了to_datetime函數,能夠實現這一目標。
值得注意的是,Timestamp類型時間是有限制的,只能表示1677-2262年的時間。
info['use_start_time'] = pd.to_datetime(info['use_start_time']) #轉換為標準時間格式數據 info.dtypespd.Timestamp.min #Timestamp('1677-09-21 00:12:43.145225') pd.Timestamp.max #Timestamp('2262-04-11 23:47:16.854775807')3.1.2DatetimeIndex函數與PeriodIndex函數
除了將數據字原始DataFrame中直接轉換為Timestamp格式外,還可以將數據單獨提取出來將其轉換為DatetimeIndex或者PeriodIndex。
轉換為PeriodIndex的時候需要注意,需要通過freq參數指定時間間隔,常用的時間間隔有Y為年,M為月,D為日,H為小時,T為分鐘,S為秒。兩個函數可以用來轉換數據還可以用來創建時間序列數據,其參數非常類似。
DatetimeIndex和PeriodIndex兩者區別在日常使用的過程中相對較小,其中DatetimeIndex是用來指代一系列時間點的一種數據結構,而PeriodIndex則是用來指代一系列時間段的數據結構。
#DatetimeIndex函數 pd.DatetimeIndex(info['lock_time']) #DatetimeIndex是用來指代一系列時間點的一種數據結構#PeriodIndex函數 pd.PeriodIndex(info['use_start_time'], freq='D')#PeriodIndex是用來指代一系列時間段的數據結構3.2時間信息數據的提取
Timestamp類常用屬性
在多數涉及時間相關的數據處理,統計分析的過程中,需要提取時間中的年份,月份等數據。使用對應的Timestamp類屬性就能夠實現這一目的。
結合Python列表推導式,可以實現對DataFrame某一列時間信息數據的提取。
a = info['use_start_time'][0] a.year #年份 a.month #月份 a.dayofyear #一年中的第幾天3.3加減時間數據
Timedelta類
Timedelta是時間相關的類中的一個異類,不僅能夠使用正數,還能夠使用負數表示單位時間,例如1秒,2分鐘,3小時等。使用Timedelta類,配合常規的時間相關類能夠輕松實現時間的算術運算。目前Timedelta函數中時間周期中沒有年和月。所有周期名稱,對應單位及其說明如下表所示。
①使用Timedelta?,可以很輕松地實現在某個時間上加減一段時間 。
②除了使用Timedelta實現時間的平移外,還能夠直接對兩個時間序列進行相減,從而得出一個Timedelta。
info['use_start_time'] + pd.Timedelta(days=1, seconds=10) #pd.Timedelta(days=1, seconds=10)構造的是一個“1天10秒”的Timedelta # 數據,此處的操作是可實現對“use_start_time”一列的時間數據加上一天10秒。pd.to_datetime('2020-09-24') - info['use_start_time'] #“use_start_time”一列時間數據距離“2020-09-24”的時間差4使用分組聚合進行組內計算
4.1使用groupby方法拆分數據
該方法提供的是分組聚合步驟中的拆分功能,能根據索引或字段對數據進行分組。其常用參數與使用格式如下。
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
by參數的特別說明:
①如果傳入的是一個函數則對索引進行計算并分組。
②如果傳入的是一個字典或者Series則字典或者Series的值用來做分組依據。
③如果傳入一個NumPy數組則數據的元素作為分組依據。
④如果傳入的是字符串或者字符串列表則使用這些字符串所代表的字段作為分組依據。
用groupby方法分組后的結果并不能直接查看,而是被存在內存中,輸出的是內存地址。實際上分組后的數據對象GroupBy類似Series與DataFrame,是pandas提供的一種對象。GroupBy對象常用的描述性統計方法如下。
detail.groupby(by='order_id') #用groupby方法分組后的結果并不能直接查看,而是被存在內存中,輸出的是內存地址detail.groupby(by='order_id').count()4.2使用agg方法聚合數據
agg,aggregate方法都支持對每個分組應用某函數,包括Python內置函數或自定義函數。同時這兩個方法能夠也能夠直接對DataFrame進行函數應用操作。
在正常使用過程中,agg函數和aggregate函數對DataFrame對象操作時功能幾乎完全相同,因此只需要掌握其中一個函數即可。它們的參數說明如下表。
DataFrame.agg(func, axis=0, *args, **kwargs)
DataFrame.aggregate(func, axis=0, *args, **kwargs)
①可以使用agg方法一次求出當前數據中所有菜品銷量和售價的總和與均值,如
detail[['counts','amounts']].agg([np.sum,np.mean])
②對于某個字段希望只做求均值操作,而對另一個字段則希望只做求和操作,可以使用字典的方式,將兩個字段名分別作為key,然后將NumPy庫的求和與求均值的函數分別作為value,如
detail.agg({'counts':np.sum,'amounts':np.mean})
③在某些時候還希望求出某個字段的多個統計量,某些字段則只需要求一個統計量,此時只需要將字典對應key的value變為列表,列表元素為多個目標的統計量即可,如
detail.agg({'counts':np.sum,'amounts':[np.mean,np.sum]})
import numpy as npdetail[['counts','amounts']].agg([np.sum,np.mean]) #一次求出當前數據中所有菜品銷量和售價的總和與均值 detail.agg({'counts':np.mean, 'amounts':np.sum}) #對所有菜品銷量求均值,售價求總和 detail.agg({'counts':np.mean, 'amounts':[np.sum, np.mean]}) #對所有菜品銷量求均值,售價求總和和均值#分組聚合 detail.groupby(by='order_id').agg({'counts':np.sum}) #按“order_id”進行分組,再對菜品銷量“counts”求和 detail.groupby(by=['order_id', 'dishes_id']).agg({'counts':np.sum}) #先按“order_id”分組,再按“dishes_id”分組,再對菜品銷量“counts”求和4.3使用apply方法聚合數據
apply方法類似agg方法能夠將函數應用于每一列。不同之處在于apply方法相比agg方法傳入的函數只能夠作用于整個DataFrame或者Series,而無法像agg一樣能夠對不同字段,應用不同函數獲取不同結果。
使用apply方法對GroupBy對象進行聚合操作其方法和agg方法也相同,只是使用agg方法能夠實現對不同的字段進行應用不同的函數,而apply則不行。
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
detail.groupby(by='order_id').apply(np.sum) #單一操作,即此處只能對按“order_id”分組之后的整個數據中的每列數據求和5創建透視表與交叉表
5.1使用pivot_table函數創建透視表
利用pivot_table函數可以實現透視表,pivot_table()函數的常用參數及其使用格式如下。
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
①在不特殊指定聚合函數aggfunc時,會默認使用numpy.mean進行聚合運算,numpy.mean會自動過濾掉非數值類型數據。可以通過指定aggfunc參數修改聚合函數。
和groupby方法分組的時候相同,pivot_table函數在創建透視表的時候分組鍵index可以有多個。
②通過設置columns參數可以指定列分組。
③當全部數據列數很多時,若只想要顯示某列,可以通過指定values參數來實現。
④當某些數據不存在時,會自動填充NaN,因此可以指定fill_value參數,表示當存在缺失值時,以指定數值進行填充。
⑤可以更改margins參數,查看匯總數據。
pd.pivot_table(detail[['order_id', 'counts']], index='order_id', aggfunc=np.sum) pd.pivot_table(detail[['order_id', 'counts', 'dishes_id']], index=['order_id', 'dishes_id'], aggfunc=np.sum) pd.pivot_table(detail[['order_id', 'counts', 'dishes_id']], index='order_id', columns='dishes_id', aggfunc=np.sum)5.2使用crosstab函數創建交叉表
交叉表是一種特殊的透視表,主要用于計算分組頻率。利用pandas提供的crosstab函數可以制作交叉表,crosstab函數的常用參數和使用格式如下。
由于交叉表是透視表的一種,其參數基本保持一致,不同之處在于crosstab函數中的index,columns,values填入的都是對應的從Dataframe中取出的某一列。
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)
crosstab的常用參數及其說明
pd.crosstab(index=detail['order_id'], columns=detail['dishes_id'], values=detail['counts'], aggfunc=np.sum)?
總結
以上是生活随笔為你收集整理的Python—实训day8—掌握DataFrame的常用操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纯做技术是自娱自乐 抛开技术做技术才是出
- 下一篇: Python—实训day9—使用pand