Pandas切片操作:一個很容易忽視的錯誤
點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)
Pandas是一個強大的分析結(jié)構(gòu)化數(shù)據(jù)的工具集,主要用于數(shù)據(jù)挖掘和數(shù)據(jù)分析,同時也提供數(shù)據(jù)清洗功能。
很多初學(xué)者在數(shù)據(jù)的選取,修改和切片時經(jīng)常面臨一些困惑。這是因為Pandas提供了太多方法可以做同樣的事情,方法選擇不當(dāng),可能導(dǎo)致一些意想不到的錯誤。
Pandas切片
Pandas數(shù)據(jù)訪問方式包括:df[],.at,.iat,.loc,.iloc(之前有ix方法,pandas1.0之后已被移除)
df[] :直接索引 at/iat:通過標(biāo)簽或行號獲取某個數(shù)值的具體位置。 loc:通過標(biāo)簽選取數(shù)據(jù),即通過index和columns的值進(jìn)行選取。loc方法有兩個參數(shù),按順序控制行列選取,范圍包括start和end。 iloc:通過行號選取數(shù)據(jù),即通過數(shù)據(jù)所在的自然行列數(shù)為選取數(shù)據(jù)。iloc方法也有兩個參數(shù),按順序控制行列選取。
它們之間的區(qū)別不是文本重點,大家可以新建一個dataframe練習(xí)一下,本文我們主要來一個錯誤示范,然后給大家提一些合理的建議。
錯誤示范
新建一個DataFrame
df = pd.DataFrame({'x':[1,5,4,3,4,5],'y':[.1,.5,.4,.3,.4,.5],'w':[11,15,14,13,14,15]})x y w0 1 0.1 111 5 0.5 152 4 0.4 143 3 0.3 134 4 0.4 145 5 0.5 15
假設(shè)我們要查找與“x”列對應(yīng)的所有DataFrame元素都大于3,并根據(jù)此更改將所有對應(yīng)的“ y”值更改為50。
我們來先試一個看起來毫無問題的方法
df[df['x']>3]['y']=50
運行之后,df沒有任何變化,Warning如下:
A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value instead
根據(jù)提示信息,我們使用loc方法
df.loc[df['x']>3,'y']=50x y w0 1 0.1 111 5 50.0 152 4 50.0 143 3 0.3 134 4 50.0 145 5 50.0 15
得到預(yù)期結(jié)果√
這是為什么呢?這里我們就遇到了所謂的“鏈接索引”,具體原因是使用了兩個索引器,例如:df[][]
df[df['x']>3] 導(dǎo)致Pandas創(chuàng)建原始DataFrame的單獨副本
df[df['x']>3]['y'] = 50 將新值分配給“ y”列,但在此臨時創(chuàng)建的副本上,而不是原始DataFrame上。
反轉(zhuǎn)切片的順序時,即先調(diào)用列,然后再調(diào)用我們要滿足的條件,便得到了預(yù)期的結(jié)果:
df['y'][df['x']>3]=50x y w0 1 0.1 111 5 50.0 152 4 50.0 143 3 0.3 134 4 50.0 145 5 50.0 15
df[]方法會創(chuàng)建視圖dfx y w0 1 0.1 111 5 0.5 152 4 0.4 143 3 0.3 134 4 0.4 145 5 0.5 15z = df['y'] # view of column 'y'z[z>=0.5] = 30z0 0.11 30.02 0.43 0.34 0.45 30.0dfx y w0 1 0.1 111 5 30.0 152 4 0.4 143 3 0.3 134 4 0.4 145 5 30.0 15
當(dāng)我們創(chuàng)建了視圖后,pandas就會出現(xiàn)warning,因為它不知道我們是否只想更改y系列(通過z)或原始值df。如果我們要提取“z”作為獨立對象怎么辦?pandas提供了copy()方法,當(dāng)我們將命令更新為以下所示的命令時:
z = df['y'].copy()我們將在內(nèi)存中創(chuàng)建一個具有其自己地址的全新對象,并且對“z”進(jìn)行的任何更新df都將不受影響。實際上有兩個要點,可以使我們在使用切片和數(shù)據(jù)操作時免受任何有害影響:
避免鏈接索引,始終選擇.loc/ .iloc(或.at/ .iat)方法; 使用copy() 創(chuàng)建獨立的對象,并保護(hù)原始資源免遭不當(dāng)操縱
https://www.jianshu.com/p/199a653e9668https://www.kdnuggets.com/2020/04/stop-hurting-pandas.html
好消息!
小白學(xué)視覺知識星球
開始面向外開放啦??????
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程 在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺實戰(zhàn)項目52講 在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。 下載3:OpenCV實戰(zhàn)項目20講 在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。 交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

