Python乙個萬萬不能忽略的警告!

2021-09-19 17:05:02 字數 2146 閱讀 7592

1 乙個警告

pandas中有乙個警告,很有意思,並且出現頻率很高,它就是 settingwithcopywarning, 既然是個警告,那麼我們是不是可以忽略呢。就像標題說的那樣,萬萬不可。並且,這個警告還要引起我們足夠重視。知道為什麼會出現這個警告,並知道怎麼解決,或許幫助你真正從pandas的被動使用者,變為乙個pandas專家。

2 警告是什麼

首先要理解的是,settingwithcopywarning 是乙個警告,而不是錯誤 erro,警告的作用是提醒程式設計師,他們的**可能存在潛在的錯誤或問題,但是這些操作仍然是該程式語言中的合法操作。在這種情況下,警告很可能表明乙個嚴重但不容易意識到的錯誤。

settingwithcopywarning 告訴你,你的操作可能沒有按預期執行,你應該檢查結果以確保沒有出錯。在採取下一步行動之前,花點時間了解為什麼會獲得這一警告。

3 重要概念

要了解 settingwithcopywarning,首先需要了解 pandas 中的某些操作可以返回資料的檢視(view),而某些操作將返回資料的副本(copy)。

檢視就是原來資料的一部分,而副本是新生成的資料,和原來沒有一毛錢關係。

賦值(assignment) - 設定某些變數值的操作,例如

data = pd.read_csv('**.csv')

訪問(access) - 返回某些值的操作,例如下面的索引和鏈式索引示例

索引(indexing) - 引用資料子集的任何賦值或訪問方法,例如 data[1:5] 

鏈式索引(chaining) - 連續使用多個索引操作,例如data[1:5][1:3]

4 鏈式賦值

鏈式賦值是鏈式索引和賦值的組合。造一組資料,讓它出現這個warning

可以看到,我們很容易地就調出了這個warning,並且可以看出鏈式賦值的基本操作過程,首先,df[df['name']] 返回的是副本,也就是重新生成了乙個物件,然後再對滿足條件的行,其列score賦值,當然和原資料沒有任何關係了。

5 配置警告

pandas 的 mode.chained_assignment 選項可以採用以下幾個值之一:

'raise' - 丟擲異常(exception)而不是警告

'warn' - 生成警告(預設)

none - 完全關閉警告

例如,如果要關閉警告:

因為這樣沒有給我們任何警告,除非你完全了解自己在做什麼,否則不建議這樣做。如果你對想要實現的操作有任何一丁點的疑問,關閉警告都不被推薦。有些開發者非常重視 settingwithcopy 甚至選擇將其提公升為異常,這樣可以避免某些超出預期的行為出現。

6 追溯歷史

你可能想知道為什麼要造成這麼混亂的現狀,為什麼不明確指定索引方法是返回檢視還是副本,來完全避免 settingwithcopy 問題。要理解這一點,我們必須研究 pandas 的過去。

pandas 確定返回乙個檢視還是乙個副本的邏輯,源於它對 numpy 庫的使用,這是 pandas 庫的基礎。檢視實際上是通過 numpy 進入 pandas 的詞庫的。實際上,檢視在 numpy 中很有用,因為它們能夠可**地返回。由於 numpy 陣列是單一型別的,因此 pandas 嘗試使用最合適的 dtype 來最小化記憶體處理需求。因此,包含單個 dtype 的 dataframe 切片可以作為單個 numpy 陣列的檢視返回,這是一種高效處理方法。但是,多型別的切片不能以相同的方式儲存在 numpy 中。pandas 兼顧多種索引功能,並且保持高效地使用其 numpy 核心的能力。

最終,pandas 中的索引被設計為有用且通用的方式,其核心並不完全與底層 numpy 陣列的功能相結合。隨著時間的推移,這些設計和功能元素之間的相互作用,導致了一組複雜的規則,這些規則決定了返回檢視還是副本。經驗豐富的 pandas 開發者通常都很滿意 pandas 的做法,因為他們可以輕鬆地瀏覽其索引行為。

7 總結

不幸的是,對於 pandas 的新手來說,鏈式索引幾乎是不可避免的,因為 get 操作返回的就是可索引的 pandas 物件。此外,用 pandas 的核心開發人員之一 jeff reback 的話來說,「從語言的角度來看,直接檢測鏈式索引是不可能的,必須經過推斷才能了解」。幸運的是,解決警告只需要識別鏈式賦值並修復。如果整篇文章你只了解到了一件事,那麼就應該是這一點。

關於 的乙個容易被忽略的問題

a 0,1,2,3,0,1,2 5 a 4 3 在一般來說,所有的使用者都知道元組一旦被建立就不可更改,除非用乙個新的元組來覆蓋它,但是上面的示例有了不同的反饋。執行之後得到了異常 typeerror tuple object does not support item assignment 在這個...

7mall電商 創業者不能忽略的乙個因素 情感成本

創業生活中的點點滴滴都是對創業者的一種不斷磨鍊。很少有人能真正體會創業的旅程,直到我們在創業的征程上走了很遠。可能在我們的認知裡,創業的各種成本有人力成本 資本成本 使用者獲取成本和機會成本。但是,我們很少談論創業中最重要的一項成本 情感成本。假如我們可以將我們所擁有的情感資本存放在銀行裡,包括我們...

python定義乙個 Python定義乙個類

在物件導向的世界裡,你的 通常稱為 類的方法 method,而資料通常稱為 類的屬性 attribute,例項化的資料物件通常稱為 例項 instance。python使用class建立類。每個定義的類都有乙個特殊的方法,名為 init 可以通過這個方法控制如何初始化物件。類中方法的定義與函式的定義...