Panda基本用法

操作對(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é)果:
image.png

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é)果:
image.png

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ì)算,而是作為索引
image.png

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]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容