<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Pandas切片操作:一個很容易忽視的錯誤

          共 2896字,需瀏覽 6分鐘

           ·

          2022-07-22 10:33

          點擊上方小白學(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]=50
          x 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
          但是同樣會給出一個Warning:A value is trying to be set on a copy of a slice from a DataFrame
          SettingWithCopyWarning 是一個警告 Warning,而不是錯誤 Error。這是因為,當(dāng)我們從DataFrame中僅選擇一列時,Pandas會創(chuàng)建一個視圖,而不是副本。關(guān)于視圖和副本的區(qū)別,下圖最為形象:
          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  15
          z = df['y'] # view of column 'y'z[z>=0.5] = 30
          z0 0.11 30.02 0.43 0.34 0.45 30.0
          dfx 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ā)送廣告,否則會請出群,謝謝理解~


          瀏覽 38
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  内射网站在线观看在线观看 | 99玖玖视频 | 色爱综合网 | 成人Av无码一区二区三区 | 国产黄色A级毛片 |