學(xué)了一段時(shí)間的pandas,結(jié)果每次想對(duì)其中的某個(gè)元素進(jìn)行條件選擇替換值的時(shí)候都會(huì)遇到困難。一開始想到的是用for循環(huán),但是這樣做感覺很丑一點(diǎn)都不美感,并且當(dāng)遇到數(shù)字索引和重復(fù)索引時(shí)就不能用了。
例子:有一個(gè)矩陣,要把其中非0的元素轉(zhuǎn)換為1,其余為0。(在做虛擬變量的模型時(shí)會(huì)用到)
矩陣如下

a矩陣
第一種方法:之間用for循環(huán)遍歷a中的每個(gè)元素,感覺這種方法很不美觀,而且還會(huì)覆蓋原數(shù)據(jù)。

for循環(huán)

結(jié)果
并且這樣做最大的缺點(diǎn)是當(dāng)索引是數(shù)字索引并且不是0,1,2這樣的順序排的,那么會(huì)出問題

由于元素不能確切指定,這種方法就失效了
第二種方法:用DataFrame的apply方法
numpy中where是一個(gè)矢量型的for循環(huán)(for是對(duì)應(yīng)標(biāo)量的),numpy中的where方法有這樣的功能。np.where(cond,x,y),其中cond,x,y是一個(gè)等長(zhǎng)的list,或者Series或者array都可以。當(dāng)cond為Trun返回對(duì)應(yīng)位置的x,否則返回對(duì)應(yīng)位置的y。最終np.where返回的也是一個(gè)等長(zhǎng)的array或者list吧(不太清楚類型)
構(gòu)造如下函數(shù),就能做出條件判斷并賦值了

轉(zhuǎn)換函數(shù)
以df1為例(上面提到的)選出元素為不為0的,那么元素零就成了Nan就好識(shí)別了,再用apply方法就行了

大功告成
并且不光是虛擬變量能用,有很多操作稍微變動(dòng)下就能做,以后遇到再寫吧。。
5.29更新
第三種方法:用Series的map方法,這時(shí)trans中的x是Series中的標(biāo)量,不是矢量。
同樣以df1中的數(shù)據(jù)為例,它的列索引是重復(fù) 的整數(shù)索引,要選取對(duì)應(yīng)列,需要用到iloc方法(基于位置的索引方法)

Series的map方法