柚子快報(bào)邀請(qǐng)碼778899分享:pandas 04
柚子快報(bào)邀請(qǐng)碼778899分享:pandas 04
添加修改
對(duì)數(shù)據(jù)的修改,增加和刪除在數(shù)據(jù)處理過(guò)程中時(shí)常發(fā)生。
修改數(shù)值
在Pandas修改數(shù)值非常簡(jiǎn)單,先篩選出要修改的數(shù)值范圍,再為這個(gè)范圍重新賦值
df.iloc[0,0] # 查詢(xún)值
df.iloc[0,0] = 'Lily' # 修改值
v= [1,3,4,7,9]*20 # 生成長(zhǎng)度為100的列表
df.Q1=v # 修改Q1的值
df1 = pd.DataFrame({'Q1':{1,2,3},'Q2':[4,5,6]})
df.loc[1:3,'Q1':'Q2'] = df1 # 對(duì)于修改DataFrame,會(huì)按對(duì)應(yīng)的索引位修改
替換數(shù)據(jù)
replace 方法可以對(duì)數(shù)據(jù)進(jìn)行批量替換
s.replace(0,5) # 將列數(shù)據(jù)中的0替換為5
df.replace(0,5)# 將數(shù)據(jù)中的所有0替換為5
df.replace([0,1,2,3],4) # 將0~3全換成4
df.replace([0,1,2,3],[]4,2,3,1) # 對(duì)應(yīng)修改
s.replace([1,2],method='bfill') # 向下填充
df.repalce({0:10,1:100}) # 字典對(duì)應(yīng)修改
df.repalce({'Q1':0,'Q2':5},100) # 將指定字段的指定值修改為100
df.repalce({'Q1':{0:100,4:400}}) # 將指定列里的指定值替換為另外一個(gè)指定值
# 使用正則表達(dá)式
df.replace(to_repalce=r'bd.$',value='new',regex=True)
df.replace({'A':r'^ba.$'},{'A':'new'},regex=True)
df.repalce(regex={r'^ba.$':'new','foo':'xyz'})
df.repalce(regex=[r'^ba.$','foo'],value='new')
填充空值
fillna 對(duì)空值填入指定數(shù)據(jù),通常應(yīng)用于數(shù)據(jù)清洗
df.fillna(0) # 將空值全修改為0
df.fillna(method='ffill') # 將空值修改該為其前一個(gè)值
values={'A':0,'B':1,'C':2,'D':3}
df.fillna(value=values) # 為個(gè)各列填充不同的值
df.fillna(value=values,limit=1)# 只替換第一個(gè)
修改索引名
使用df.rename和df.rename_axis對(duì)軸名稱(chēng)進(jìn)行修改。
df.rename(columns={'team':'class'}) # 返回一個(gè)新的DataFrame
df.rename(index={0:'x',1:'y',2:'z'}) # 對(duì)索引進(jìn)行修改
df.rename(index=str) # 對(duì)類(lèi)型進(jìn)行修改
df.rename(str.lower,axis='columns') # 傳索引類(lèi)型
df.rename({1:2,2:4},axis='index')
# 對(duì)索引名進(jìn)行修改
s.rename_axis('animal')
df.rename_axis('animal') # 默認(rèn)是列索引
df.rename_axis('limbs',axis='columns') # 指定行索引
df.rename_axis(index={'type':'class'}) # 索引為多層索引時(shí)可以可以將type修改為class
# 可以使用set_axis進(jìn)行設(shè)置修改
s.set_axis(['a','b','c'],axis=0)
df.set_axis(['I','II'],axis='columns')
df.set_axis(['I','II'],axis='columns',inplace=True)
增加列
Pandas 可以像定義一個(gè)變量一樣定義DataFrame中新的列
df['total'] = df.Q1+df.Q2+df.Q3+df.Q4 # 增加total 列,直接在原DataFrame上操作
df['total'] = df.sum(1) # 與上相同
df['foo'] = 100 # 新增一列foo,所有的值都是100
df.loc[df.num >= 60 ,'成績(jī)'] = '合格'
df.loc[df.num < 60 , '成績(jī)'] = '不合格'
df.insert()方法可以插入一個(gè)新的列
df.insert(2,'total',df.sum(1)) # 在第三列的位置上插入新列total,返回DataFrame
# 如果已經(jīng)存在相同的數(shù)據(jù)列,會(huì)報(bào)錯(cuò)
df.assign(k=v)為指定一個(gè)新列操作,k為列名,v為此列的值;v必須是一個(gè)與原數(shù)據(jù)同索引的Series
df.assign(toatl = df.sum(1)) # 返回一個(gè)新的DataFrame
df.assign(toatl = df.sum(1)).assign(Q=100) # 增加兩列
# 使用鏈?zhǔn)椒椒ㄔ黾佣嗔?/p>
df.assign(total=df.sum(1)) # 總成績(jī)
.assign(Q=100) # 目標(biāo)成績(jī)
.assign(name_len,name.str.len()) # 姓名長(zhǎng)度
.assign(avg=df.mean(1)) # 平均值
.assign(avg2=lambda d : d.total/4)# 平均值2
df.eval() 可以以字符表達(dá)式,增加列數(shù)
df.eval('total = Q1+Q2+Q3+Q4') # 返回DataFrame
a = df.Q1.mean()
df.eval('C3=`Q3`+@a') # 使用變量
df.eval('C4 = name+team',inplace=True) #立即生效
增加行
可以使用loc[]指定索引給出所有列的值來(lái)增加一行數(shù)據(jù)。
df.loc[100] = ['tom','A',80,81,83,88] # 新增索引為100的數(shù)據(jù),指定全列的值
df.loc[101] = {'Q1':89,'Q2':99} # 指定列,無(wú)數(shù)據(jù)的值為NaN
df.loc[df.shape[0]+1] = {'Q1':89,'Q2':99} # 自動(dòng)增加索引
df.loc[len(df)+1] = {'Q1':89,'Q2':99} # 同上
df.append() 可以追加一個(gè)新行
df = pd.DataFrame([[1,2],[3,4]],columns=list('AB'))
df2 = pd.DataFrame([[5,6],[7,8]],columns=list('AB'))
df.append(df2) # 返回一個(gè)新的DataFrame
刪除
刪除有兩種方法,一種是使用pop()函數(shù)(DataFrame 和 Series都支持,刪除操作是事實(shí)生效的),返回刪除的數(shù)據(jù)
s.pop(3) #刪除索引為3的數(shù)據(jù),返回索引對(duì)應(yīng)的數(shù)值
df.pop('Q1') #刪除Q列,返回Serices
另外一種方法是使用反選法,將需要的數(shù)據(jù)篩選出來(lái)賦值給原變量。
在一些情況下會(huì)刪除有空值、缺失不全的數(shù)據(jù),df.dropna 可以執(zhí)行這種操作
df.dropna() # 刪除有缺失值de行(只要有空值,就刪除)
df.dropna(axis='columns') # 刪除有缺失值的列(只要有空值,就刪除)
df.dropna(how='all',inplace=True) # 行或列全是空值的刪除,inplace=True表示立即生效
df.dropna(thresh=2,axis=0) # 不足兩個(gè)非空值是刪除
高級(jí)過(guò)濾
df.where()
df.where()中可以傳入一個(gè)布爾表達(dá)式、布爾值的Series/DataFrame、序列或者可調(diào)用的對(duì)象,然后與原數(shù)據(jù)多對(duì)比,返回一個(gè)行與列的索引與原數(shù)據(jù)相同的數(shù)據(jù),滿(mǎn)足條件的保留原值,不滿(mǎn)足條件的位置填充N(xiāo)aN。
df = df.select_dtypes(include='number') # 只保留數(shù)字類(lèi)型列
df.where(df > 70) # 數(shù)值大于70
# Q1 Q2 Q3 Q4
# 0 89.0 NaN NaN NaN
# 1 NaN NaN NaN NaN
# 2 NaN NaN NaN 84.0
# 3 93.0 96.0 71.0 78.0
# 4 NaN NaN NaN 86.0
# .. ... ... ... ...
df.where(lambda d: d.Q1>50) # Q1列大于50 傳入lambda
#.......
df.Q1.where(pd.Series([True]*3)) # 傳入布爾值Series,前三個(gè)為真
可以指定一個(gè)值或者算法替換NaN
df.where(df>=60,'不及格')
# Q1 Q2 Q3 Q4
# 0 89 不及格 不及格 64
# 1 不及格 不及格 不及格 不及格
# 2 不及格 60 不及格 84
# 3 93 96 71 78
# 4 65 不及格 61 86
# .. ... ... ... ...
# c 定義一個(gè)數(shù)是否為偶數(shù)的表達(dá)式
c = df%2 == 0
# 傳入c,為偶數(shù)顯示原值減去20后的相反數(shù)
df.where(~c,~(df -20))
np.where()
np.where()是NumPy的一個(gè)功能,雖然不是Pandas提供的,但可以彌補(bǔ)df.where()的不足。df.where()方法可以將滿(mǎn)足條件的值篩選出來(lái),將不滿(mǎn)足的值替換為另外一個(gè)值,但無(wú)法對(duì)滿(mǎn)足條件的值進(jìn)行替換,而np.where()實(shí)現(xiàn)了這種功能
np.where(df>=60,'合格','不合格') # 返回一個(gè)二維數(shù)組
# 讓df.where()z中的條件為假,從而應(yīng)用np.where()的結(jié)果
df.where(df == 99999,np.where(df>=60,'合格','不合格'))
df.assign(avg=df.mean(1)).assign(jg=lambda d:np.where(d.avg>=60,'是','否'))
df.mask()
與df.where()的用法基本相同,唯一的區(qū)別是df.mask()將滿(mǎn)足條件的位置填充為NaN
df.lookup()
語(yǔ)法為df.lookup(行標(biāo)簽,列標(biāo)簽),返回一個(gè)numpy.ndarray,標(biāo)簽必須是一個(gè)序列。
# 行列相同數(shù)量,返回一個(gè)array
df.lookup([1,3,4],['Q1','Q2','Q3'])
df.lookup([1],'Q1')
數(shù)據(jù)迭代
迭代Series
直接對(duì)Series使用for語(yǔ)句遍歷它的值:
for i in df.name:
print(i) # 打印出df.name中的條目
迭代索引和指定的多列,可以使用內(nèi)置zip函數(shù)
for i,n,q in zip(df.index,df.name,df.Q1):
print(i,n,q)
df.iterrows()
df.iterrows()生成一個(gè)可迭代對(duì)象,將DataFrame行為(索引,行數(shù)據(jù))組成Series數(shù)據(jù)對(duì)進(jìn)行迭代。
# 迭代,使用name、Q1數(shù)據(jù)
for index,row in df.iterrows():
# index 是索引(不一定是數(shù)字)
print(index,row['name'],row.Q1)
df.iterrows()是最常用、最方便的按行迭代方法
df.items()
df.items()和df.iteritems()功能相同,都是列迭代,返回Series對(duì)象(列)
for label,ser in df.items():
print(label) # 列名
print(ser[:3],end='\n') # 取前三個(gè)
直接對(duì)DataFrame迭代,會(huì)得到列名
for column in df:
print(column) # 列名
函數(shù)應(yīng)用
pipe():應(yīng)用在整個(gè)DataFrame或Series上apply():應(yīng)用在DataFrame的行或列中,默認(rèn)為列applymap():應(yīng)用在DataFrame的每個(gè)元素中map():應(yīng)用在Series或DataFrame的一列的每個(gè)元素中
pipe()
Pandas提供的pipe()叫做管道方法,可以讓分析過(guò)程標(biāo)準(zhǔn)化、流水化、達(dá)到服用目標(biāo)。DataFrame和Series都支持pipe()方法。語(yǔ)法結(jié)構(gòu):df.pipe(函數(shù)名,函數(shù)參數(shù)列表或字典),第一個(gè)參數(shù)為DataFrame、Series。
# 對(duì)df多重應(yīng)用多個(gè)函數(shù)
f(g(h(df),arg1=a),arg2=b,arg3=c)
# 用pipe可以把它們連接起來(lái)
df.pipe(h)
.pipe(q,arg1=a)
.pipe(f,arg2=b,arg3=c) # 鏈?zhǔn)椒椒?/p>
# 其中n是要加的值,為比傳參數(shù)
# 返回值必須為DataFrame
def add_mean(rdf,n):
df = rdf.copy()
df = df.loc[:,'Q1':'Q4'].applymap(lambda x:x+n)
df['avg'] = df.loc[:,'Q1':'Q4'].mean(1)
return df
# 調(diào)用
df.pipe(add_mean,100)
函數(shù)部分可以為lambda
# 篩選出Q1大于等于80且Q2大于等于90的數(shù)據(jù)
df.pipe(lambda df_,x,y:df_[(df_.Q1>=x) & (df_.Q2 >=y)],80,90)
apply()
apply()可以對(duì)DataFrame按行和列(默認(rèn))進(jìn)行行數(shù)處理,也支持Series。如果是Series,逐個(gè)傳入具體值,DataFrame逐行或逐列傳入。
# 將name全部變?yōu)樾?xiě)
df.name.apply(lambda x:x.lower())
## 列
# 去掉一個(gè)最高分和一個(gè)最低分,在計(jì)算出平均值
def my_mean(s):
max_min_ser = pd.Series([-s.max(),-s.min()])
return s.append(max_min_ser).sum()/(s.count()-2)
# 對(duì)數(shù)字列應(yīng)用函數(shù)
df.select_dtypes(include='number').apply(my_mean)
## 行 axis=1
df.select_dtypes(include='number').apply(lambda :x.sum()/x.count(),axis=1)
apply()可以應(yīng)用的函數(shù)類(lèi)型如下:
df.apply(func) #自定義
df.apply(max) # python 內(nèi)置函數(shù)
df.apply(lambda x:x*2) # lambda
df.apply(np.mean) # Numpy 等其他庫(kù)的函數(shù)
df.apply(pd.Series,first_valid_index) # pandas 自己的函數(shù)
applymap()
df.applymap()可以實(shí)現(xiàn)元素級(jí)函數(shù)應(yīng)用,即對(duì)DataFrame中所有的元素(不包括索引)應(yīng)用函數(shù)處理
def mylen(x):
return len(str(x))
df.applymap(lambda x: len(str(x)))
df.applymap(mylen) # 同上
map()
map()根據(jù)輸入對(duì)應(yīng)關(guān)系映射值返回最終數(shù)據(jù),用于Series對(duì)象或DataFrame對(duì)象的一列。傳入一個(gè)字典,鍵為原數(shù)據(jù)值,值為替換后的值。可以傳入一個(gè)函數(shù)(參數(shù)為Series的每個(gè)值)。還可以傳入一個(gè)字符格式化表達(dá)式來(lái)格式化數(shù)據(jù)內(nèi)容。
df.team.map({'A':'一班','B':'二班','C':'三班','D':'四班'}) # 枚舉替換
df.team.map('I am a {}'.format)
df.team.map('I am a {}'.format,na_action='ignore')
t=pd.Series({'six':6.,'seven':7.})
s.map(t)
# 應(yīng)用函數(shù)
def f(x):
return len(str(x))
df['name'].map(f)
agg()
agg()一般用于使用指定軸上的一項(xiàng)或多項(xiàng)操作進(jìn)行匯總,可以傳入一個(gè)函數(shù)或函數(shù)的字符,還可以用于列表的形式傳入多個(gè)函數(shù)
# 每列的最大值
df.agg('max')
# 將所有列聚合產(chǎn)生sum和min兩行
df.agg(['sum','min'])
# 序列多個(gè)聚合
df.agg({'Q1':['sum','min'],'Q2':['min','max']})
# 分組后聚合
df.groupby('team').agg('max')
df.Q1.agg(['sum','mean'])
def mymean(x):
return x.mean()
df.Q2.agg(['sum',mymean])
# 每列指定不同的聚合
df.agg(a=('Q1',max),
b=('Q2','min'),
c=('Q3',np.mean),
d=('Q4',lambda s:s.sum()+1))
# 按行聚合
df.loc[:,'Q1':].agg('mean',axis='columns')
# 利用pd.Series.add方法對(duì)所有數(shù)據(jù)加分,other是add方法的參數(shù)
df.loc[:,'Q1':].agg(pd.Series.add,other=10)
agg()的用法整體上與apply()極為相似
transform()
DataFrame或Series自身調(diào)用函數(shù)并返回一個(gè)與自身長(zhǎng)度相同的數(shù)據(jù)
df.transform(lambda x:x*2) # 應(yīng)用匿名函數(shù)
df.transform([np.sqrt,np.exp]) # 調(diào)用多個(gè)函數(shù)
df.transform([np.abs,lambda x:x+1])
df.transform({'A':np.abs,'B':lambda x:x+1})
df.transform('abs')
df.transform(lambda x:x.abs())
copy()
類(lèi)似于Python中copy()函數(shù),df.copy()方法可以返回一個(gè)新對(duì)象,這個(gè)新對(duì)象與原對(duì)象沒(méi)有關(guān)系。
當(dāng)deep=False(默認(rèn)是True)時(shí),將創(chuàng)建一個(gè)對(duì)象而不復(fù)制調(diào)用對(duì)象的數(shù)據(jù)或索引(僅復(fù)制對(duì)數(shù)據(jù)和索引的引用)。原始數(shù)據(jù)的任何更改都將對(duì)淺拷貝的副本進(jìn)行同步修改,反之亦然。
柚子快報(bào)邀請(qǐng)碼778899分享:pandas 04
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。