操作對(duì)象
Series
pd.Series( data,index,dtype,name,copy)
Series 是一種類(lèi)似于一維數(shù)組的對(duì)象,由下面兩部分組成:
- data:一維數(shù)據(jù),可迭代對(duì)象??梢园笔?shù)據(jù),Pandas 使用NaN(Not a Number)來(lái)表示缺失或無(wú)值
s = pd.Series(list('abc')) #列表
a = pd.Series(np.arange(3)) #數(shù)組
d = pd.Series({'a': 1,'b': 2,'c': 3}) #字典
- index:數(shù)據(jù)索引。每個(gè) Series 都有一個(gè)索引,它可以是整數(shù)、字符串、日期等類(lèi)型。如果不指定索引,Pandas 將默認(rèn)創(chuàng)建一個(gè)從 0 開(kāi)始的整數(shù)索引。
a = pd.Series(np.arange(3),index=list('abc'))
a.c #非數(shù)字索引時(shí),可以直接對(duì)象.索引
a['c'] #2 數(shù)字索引不能對(duì)象.索引,可以對(duì)象[number]
a[['b','c']] #也可以傳索引列表,返回新的Series對(duì)象
顧名思義,我們?cè)趧?chuàng)建 series 對(duì)象時(shí),需要傳遞一組數(shù)據(jù),該數(shù)據(jù)大多數(shù)時(shí)候是可迭代對(duì)象。
PS:
Series支持切片
a = pd.Series(np.arange(3),index=list('abc'))
a['a':'c'] #非數(shù)字索引左閉右閉,取a b c
d = pd.Series(np.arange(3))
d[0:2] #數(shù)字索引左閉右開(kāi),只取0 1
DataFrame
DataFrame 是 Pandas 的核心數(shù)據(jù)結(jié)構(gòu),用于以表格形式和處理數(shù)據(jù),類(lèi)似提供電子表格或數(shù)據(jù)庫(kù)表格,是一個(gè)二維的數(shù)據(jù)結(jié)構(gòu),可以理解由多個(gè)Series對(duì)象組成
pd.DataFrame( data, index, columns, dtype, copy)
- data: 可迭代對(duì)象,可以是 ndarray,series,list,dict,標(biāo)量以及一個(gè) DataFrame
- index:行標(biāo)簽,如果沒(méi)有傳遞 index 值,則默認(rèn)行標(biāo)簽是 np.arange(n),n 代表 data 的元素個(gè)數(shù)。
- columns:列標(biāo)簽,如果沒(méi)有傳遞 columns 值,則默認(rèn)列標(biāo)簽是 np.arange(n)
df = pd.DataFrame(np.arange(6).reshape(3,2),index=list('abc'),columns=list('AB')) #二維數(shù)組,指定行列索引
df1 = pd.DataFrame(pd.Series(np.arange(6),index=list('abcdef')),columns=list('B')) #一維Series對(duì)象,由Series指定行索引。如果dataframe和Series行索引不一致,最終導(dǎo)致DataFrame值維NAN
print(df,df1)
常用函數(shù)
apply()
apply 是 pandas 中的一個(gè)非常強(qiáng)大的函數(shù),它可以對(duì) Series 或 DataFrame 的數(shù)據(jù)進(jìn)行操作。該函數(shù)主要用于當(dāng)沒(méi)有現(xiàn)成的函數(shù)可以直接完成任務(wù)時(shí),你可以使用 apply 將自定義函數(shù)應(yīng)用于數(shù)據(jù),它可以對(duì)數(shù)據(jù)進(jìn)行逐行或逐列的操作,非常適合進(jìn)行復(fù)雜的、自定義的數(shù)據(jù)處理。
PS:apply默認(rèn)是按列操作
# apply 是一個(gè)非常靈活的函數(shù),可以應(yīng)用對(duì)象是Servies或者DataFrame對(duì)象
DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)
Series.apply(func, convert_dtype=True, args=(), **kwds)
- func: 要應(yīng)用的函數(shù)。
- axis: 默認(rèn)為0。對(duì)于DataFrame,axis=0表示應(yīng)用函數(shù)到每一列,axis=1表示應(yīng)用函數(shù)到每一行。
- raw: 默認(rèn)為False。確定是否將數(shù)據(jù)轉(zhuǎn)換為Python原生類(lèi)型。
- result_type: 默認(rèn)為None。這可以是expand、reduce、broadcast或None之一,它決定了返回的數(shù)據(jù)類(lèi)型。
- args: 傳遞給func的位置參數(shù)的元組。
e.g:
df = pd.DataFrame(np.arange(6).reshape(3,2),index=list('abc'),columns=list('AB'))
print(df)
#自定義函數(shù)
def cal(x):
return x**2+x*2
ap = df.apply(cal,axis=1) #指定按行操作
示例結(jié)果: 
e.g:
data = {
'商品名稱(chēng)':['電腦','照相機(jī)','手機(jī)','ps5'],
'銷(xiāo)售價(jià)格':[10000,12000,7000,4000]
}
# 13%的商品稅額
df2 = pd.DataFrame(data)
# 第一種方法
print(df2['銷(xiāo)售價(jià)格']*0.13)
# 第二種方式
df2['商品稅額'] = df2['銷(xiāo)售價(jià)格'].apply(lambda x:x*0.13) #Series對(duì)象.apply
df2
示例結(jié)果:
map()
map方法主要用于對(duì) Series 對(duì)象中的每個(gè)元素應(yīng)用一個(gè)指定的函數(shù)或映射關(guān)系。它通常用于數(shù)據(jù)清洗和轉(zhuǎn)換,比如將字符串轉(zhuǎn)換為其他格式,或者根據(jù)一個(gè)映射字典將值替換為新的值。
Series.map(arg)
- arg:函數(shù)、字典或其他映射關(guān)系。指定應(yīng)用于Series每個(gè)元素的映射規(guī)則。
- na action: None或ignore,默認(rèn)為None。指定遇到缺失值(NaN)時(shí)的處理方式。如果設(shè)置為ignore,則忽略NaN值,不將其傳遞給映射關(guān)系
e.g:
data = pd.DataFrame({
'name':['A1','B1','C1','D1'],
'gender':['F','M','F','M'],
'age': [11,12,13,14]
})
dict_gender = {
'F': '男',
'M': '女'
}
data['gender_dec'] = data['gender'].map(dict_gender) #data['gender']這一列Series對(duì)象應(yīng)用字典映射
#結(jié)果
name gender age gender_dec
0 A1 F 11 男
1 B1 M 12 女
2 C1 F 13 男
3 D1 M 14 女
def age_cal(x):
return x*2
data['new_age'] = data['age'].map(age_cal) #data['age']這一列Series對(duì)象應(yīng)用自定義函數(shù),再寫(xiě)入新的一列‘new_age’
data
#結(jié)果:
name gender age gender_dec new_age
0 A1 F 11 男 22
1 B1 M 12 女 24
2 C1 F 13 男 26
3 D1 M 14 女 28
計(jì)算描述統(tǒng)計(jì)
常用方法
設(shè)置索引set_index
data = {
"名字":["Lcuy",'Tony','Tom','Jack'],
'數(shù)學(xué)':[85,92,78,65],
"英語(yǔ)":[76,88,92,72],
"歷史":[90,82,68,56]
}
df3 = pd.DataFrame(data)
# 為了確保能正常計(jì)算, 需要設(shè)置名字為索引列
df4 = df3.set_index('名字')
print(df3)
print(df4) #設(shè)置這一列為索引值,在科學(xué)計(jì)算時(shí)這一列就不會(huì)再參與計(jì)算,而是作為索引

idxmax
返回一個(gè) Series,其中每個(gè)元素表示該列最大值所在的索引
print(df4.idxmax()) #返回每一列最大值所在索引(index,columns)
#結(jié)果
數(shù)學(xué) Tony
英語(yǔ) Tom
歷史 Lcuy
科學(xué)計(jì)算常用方法
科學(xué)計(jì)算方法比較多,在使用到時(shí)可單獨(dú)查詢(xún)
在計(jì)算時(shí),如果遇到不可計(jì)算的列,如字符串列,會(huì)自動(dòng)忽略
平均值
mean()函數(shù)是 pandas DataFrame 和 Series 對(duì)象的一個(gè)方法,用于計(jì)算指定軸上的平均值。默認(rèn)情況下,它沿著列(即軸0)計(jì)算平均值。
data = {
"名字":["Lcuy",'Tony','Tom','Jack'],
'數(shù)學(xué)':[85,92,78,65],
"英語(yǔ)":[76,88,92,72],
"歷史":[90,82,68,56]
}
df3 = pd.DataFrame(data)
# 為了確保能正常計(jì)算, 需要設(shè)置名字為索引列
df4 = df3.set_index('名字')
print(df4.mean())
#示例結(jié)果
數(shù)學(xué) 80.0
英語(yǔ) 82.0
歷史 74.0
dtype: float64
中位數(shù)
median()函數(shù)在pandas中主要用于計(jì)算DataFrame或Series的中位數(shù)。對(duì)于Series,它會(huì)直接返回該Series的中位數(shù);對(duì)于DataFrame,則可以指定軸(axis)來(lái)計(jì)算每行或每列的中位數(shù)。
print(df4.median())
標(biāo)準(zhǔn)差
std()函數(shù)是 pandas 庫(kù)中 series 和 DataFrame 對(duì)象的一個(gè)方法,用于計(jì)算數(shù)據(jù)集的標(biāo)準(zhǔn)差。標(biāo)準(zhǔn)差是衡量數(shù)據(jù)分布離散程度的重要指標(biāo),反映了數(shù)據(jù)點(diǎn)與其均值之間的平均距離。
print(df4.std())
協(xié)方差
cov()函數(shù)用于計(jì)算數(shù)據(jù)集中不同列之間的協(xié)方差。在概率論和統(tǒng)計(jì)學(xué)中用于衡量?jī)蓚€(gè)變量的總體誤差。 如果兩個(gè)變量的變化趨勢(shì)一致,即其中一個(gè)大于自身的期望值,另外一個(gè)也大于自身的期望值,那么兩個(gè)變量之間的協(xié)方差就是正值。如果兩個(gè)變量的變化趨勢(shì)相反,即其中一個(gè)大于自身的期望值,另外一個(gè)卻小于自身的期望值,那么兩個(gè)變量之間的協(xié)方差就是負(fù)值。
print(df4['數(shù)學(xué)'].cov(df4['英語(yǔ)']))
相關(guān)性
相關(guān)性,是指兩個(gè)變量的關(guān)聯(lián)程度。一般地,從散點(diǎn)圖上可以觀察到兩個(gè)變量有以下三種關(guān)系之一:兩變量正相關(guān)、負(fù)相關(guān)、不相關(guān)
print(df4['數(shù)學(xué)'].corr(df4['英語(yǔ)']))
數(shù)據(jù)處理
dropna
在數(shù)據(jù)分析的過(guò)程中,經(jīng)常遇到數(shù)據(jù)集中存在缺失值的情況。dropna()函數(shù)可以根據(jù)指定的條件刪除包含缺失值的行或列
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
- axis:可選參數(shù),表示刪除行還是列。默認(rèn)值為0,表示刪除包含缺失值的行;設(shè)置為1表示刪除包含缺失值的列。
- how:可選參數(shù),表示刪除的條件。默認(rèn)值為’any’,表示只要存在一個(gè)缺失值就刪除整行或整列;設(shè)置為’all’表示只有當(dāng)整行或整列都是缺失值時(shí)才刪除。
data = {
'月份':['1月','2月','3月','4月','5月'],
'房租':[2000,2000,2000,2000,2000],
'水電':[300,280,None,310,290],
'餐費(fèi)':[500,None,480,600,560],
'交通':[150,140,150,None,None]
}
df5 = pd.DataFrame(data)
# 只要有一個(gè)缺失值,則刪除包含缺失值的行
df6 = df5.dropna(how='any')
# 只要這一行全部是缺失值,則刪除包含缺失值的行
df7 = df5.dropna(how='all')
- thresh:可選參數(shù),表示在刪除之前需要滿(mǎn)足的非缺失值的最小數(shù)量。如果行或列中的非缺失值數(shù)量小于等于thresh,則會(huì)被刪除。
data = {
'月份':['1月','2月','3月','4月','5月'],
'房租':[2000,2000,2000,2000,2000],
'水電':[300,280,None,310,290],
'餐費(fèi)':[500,None,480,600,560],
'交通':[150,140,150,None,None]
}
df5 = pd.DataFrame(data)
print(df5)
print(df5.dropna(thresh=4,axis=1)) #至少需要4個(gè)非缺失值才保留行或列,交通列會(huì)被刪除
- subset:可選參數(shù),用于指定要檢查缺失值的特定列名或行索引。
print(df5.dropna(subset=['交通','水電'])) #只在交通水電列里檢查
- inplace:可選參數(shù),表示是否對(duì)原始數(shù)據(jù)進(jìn)行就地修改。默認(rèn)值為False,表示不修改原始數(shù)據(jù),而是返回一個(gè)新的數(shù)據(jù)框。
填充fillna()
pandas中fillna()方法,能夠使用指定的方法填充N(xiāo)A/NaN值。
fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
value:用于填充的空值的值。
method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None。定義了填充空值的方法, pad / ffill表示用前面行/列的值,填充當(dāng)前行/列的空值, backfill / bfill表示用后面行/列的值,填充當(dāng)前行/列的空值。
axis:軸。0或’index’,表示按行刪除;1或’columns’,表示按列刪除。
inplace:是否原地替換。布爾值,默認(rèn)為False。如果為T(mén)rue,則在原DataFrame上進(jìn)行操作,返回值為None。
limit:int, default None。如果method被指定,對(duì)于連續(xù)的空值,這段連續(xù)區(qū)域,最多填充前 limit 個(gè)空值(如果存在多段連續(xù)區(qū)域,每段最多填充前 limit 個(gè)空值)。如果method未被指定, 在該axis下,最多填充前 limit 個(gè)空值(不論空值連續(xù)區(qū)間是否間斷)
downcast:dict, default is None,字典中的項(xiàng)為,為類(lèi)型向下轉(zhuǎn)換規(guī)則?;蛘邽樽址癷nfer”,此時(shí)會(huì)在合適的等價(jià)類(lèi)型之間進(jìn)行向下轉(zhuǎn)換,比如float64 to int64 if possible。
e.g:
data = {
'月份':['1月','2月','3月','4月','5月'],
'房租':[2000,2000,2000,2000,2000],
'水電':[300,280,None,310,290],
'餐費(fèi)':[500,None,480,600,560],
'交通':[150,140,150,None,None]
}
df6 = pd.DataFrame(data)
print(df6.fillna(value='a')) #NAN填充為a
print(df6.fillna(method='ffill')) #前一行的值填充當(dāng)前的NAN
去重
df6.drop_duplicates() #每行重復(fù)數(shù)據(jù)去重
df6.duplicated() #查詢(xún)是否有重復(fù),返回布爾值
替換
sales_data['sale_date'].replace('2024-10-1','2024-11-11') #按照索引替換
處理單元格內(nèi)部數(shù)據(jù) str
# 把name 全部變成大寫(xiě)
df6['name'].str.upper()
# 把name 首字母變成大寫(xiě)
df6['name'].str.capitalize()
# 索引使用
df6['name'].str[0]