快速解釋如何使用pandas的inplace參數

2021-01-11 deephub

介紹

在操作dataframe時,初學者有時甚至是更高級的數據科學家會對如何在pandas中使用inplace參數感到困惑。

更有趣的是,我看到的解釋這個概念的文章或教程並不多。它似乎被假定為知識或自我解釋的概念。不幸的是,這對每個人來說都不是那麼簡單,因此本文試圖解釋什麼是inplace參數以及如何正確使用它。

讓我們來看看一些使用inplace的函數的例子:

fillna()dropna()sortvalues()resetindex()sort_index()rename()

我已經創建了這個列表,可能還有更多的函數使用inplace作為參數。我沒有記住所有這些函數,但是作為參數的幾乎所有pandas DataFrame函數都將以類似的方式運行。這意味著在處理它們時,您將能夠應用本文將介紹的相同邏輯。

創建一個示例DataFrame

為了說明inplace的用法,我們將創建一個示例DataFrame。

import pandas as pdimport numpy as npclient_dictionary = {'name': ['Michael', 'Ana', 'Sean', 'Carl', 'Bob'], 'second name': [None, 'Angel', 'Ben', 'Frank', 'Daniel'], 'birth place': ['New York', 'New York', 'Los Angeles', 'New York', 'New York'], 'age': [10, 35, 56, None, 28], 'number of children': [0, None, 2, 1, 1]}df = pd.DataFrame(client_dictionary)df.head()

我們創建了一個數據框架,該數據框架有5行,列如下: name, second name, birthplace,age,number of children。注意,age、second name和children列中有一些缺失值(nan)。

現在我們將演示dropna()函數如何使用inplace參數工作。因為我們想要檢查兩個不同的變體,所以我們將創建原始數據框架的兩個副本。

df_1 = df.copy()df_2 = df.copy()

下面的代碼將刪除所有缺少值的行。

df_1.dropna(inplace=True)

如果您在Jupyter notebook中運行此操作,您將看到單元格沒有輸出。這是因為inplace=True函數不返回任何內容。它用所需的操作修改現有的dataframe,並在原始dataframe上「就地」(inplace)執行。

如果在dataframe上運行head()函數,應該會看到有兩行被刪除。

df_1.head()

現在我們用inplace = False運行相同的代碼。注意,這次我們將使用df_2版本的df

df_2.dropna(inplace=False)

如果您在Jupyter notebook中運行此代碼,您將看到有一個輸出(上面的屏幕截圖)。inplace = False函數將返回包含刪除行的數據。

記住,當inplace被設置為True時,不會返回任何東西,但是原始數據被修改了。

那麼這一次原始數據會發生什麼呢?讓我們調用head()函數進行檢查。

df_2.head()

原始數據不變!那麼發生了什麼?

當您使用inplace=True時,將創建並更改新對象,而不是原始數據。如果您希望更新原始數據以反映已刪除的行,則必須將結果重新分配到原始數據中,如下面的代碼所示。

df_2 = df_2.dropna(inplace=False)

這正是我們在使用inplace=True時所做的。是的,最後一行代碼等價於下面一行:

df_2.dropna(inplace=True)

後者更優雅,並且不創建中間對象,然後將其重新分配給原始變量。它直接改變原始數據框架,因此,如果需要改變原始數據,那麼inplace=True是首選。

那麼,為什麼會有在使用inplace=True產生錯誤呢?我不太確定,可能是因為有些人還不知道如何正確使用這個參數。讓我們看看一些常見的錯誤。

常見錯誤

使用inplace = True處理一個片段

如果我們只是想去掉第二個name和age列中的NaN,而保留number of children列不變,我們該怎麼辦?

我見過有人這樣做:

df[['second name', 'age']].dropna(inplace=True)

這會拋出以下警告。

這個警告之所以出現是因為Pandas設計師很好,他們實際上是在警告你不要做你可能不想做的事情。該代碼正在更改只有兩列的dataframe,而不是原始數據框架。這樣做的原因是,您選擇了dataframe的一個片段,並將dropna()應用到這個片段,而不是原始dataframe。

為了糾正它,可以這樣使用

df.dropna(inplace=True, subset=['second name', 'age'])df.head()

這將導致從dataframe中刪除第二個name和age列中值為空的行。

將變量值賦給inplace= True的結果

df = df.dropna(inplace=True)

這又是你永遠不應該做的事情!你只需要將None重新賦值給df。記住,當你使用inplace=True時,什麼也不會返回。因此,這段代碼的結果是將把None分配給df。

總結

我希望本文為您揭開inplace參數的神秘面紗,您將能夠在您的代碼中正確地使用它。

相關焦點

  • Pandas的介紹與基本使用
    1、什麼是Pandas當大家談論到數據分析時,提及最多的語言就是Python和SQL,而Python之所以適合做數據分析,就是因為他有很多強大的第三方庫來協助,pandas就是其中之一,它是基於Numpy構建的,正因pandas的出現,讓Python語言也成為使用最廣泛而且強大的數據分析環境之一。
  • 幾個Pandas參數設置小技巧
    在日常使用pandas的過程中,由於我們所分析的數據表規模、格式上的差異,使得同樣的函數或方法作用在不同數據上的效果存在差異。而pandas有著自己的一套「參數設置系統」,可以幫助我們在遇到不同的數據時靈活調節從而達到最好的效果,本文就將介紹pandas中常用的參數設置方面的知識
  • 如何使用Pandas-Profiling進行探索性數據分析
    pandas_profiling使用df.profile_report()擴展了DataFrame,以便進行快速數據分析。每一列的以下統計數據(如果與列類型相關)都顯示在交互式HTML報告中:類型推斷:檢測DataFrame中列的類型。
  • 如何用pandas更快地進行數據可視化?
    作者:劉早起來源:早起Python(公眾號)如果你經常使用Python進行數據分析,那麼對於pandas一定不會陌生,但是Pandas除了在數據處理上大放異彩,隨著版本的不斷更新,Pandas的繪圖功能在某些情況下甚至要比matplotlib更加適用,本文就將介紹如何用
  • pandas使用的25個技巧
    查詢pandas版本  如果你還想知道pandas所依賴的模塊的版本,你可以使用show_versions()函數:使用astype()函數將數據類型轉換成數值型但是,如果你對第三列也使用這個函數,將會引起錯誤,這是因為這一列包含了破折號(用來表示0)但是pandas並不知道如何處理它。
  • 在pandas中使用pipe()提升代碼可讀性
    簡介我們在利用pandas開展數據分析時,應儘量避免過於「碎片化」的組織代碼,尤其是創建出過多不必要的「中間變量」,既浪費了「內存」,又帶來了關於變量命名的麻煩,更不利於整體分析過程代碼的可讀性,因此以流水線方式組織代碼非常有必要。
  • 使用pandas和openpyxl處理複雜Excel數據
    關於Excel數據處理,很多同學可能使用過Pyhton的pandas模塊,用它可以輕鬆地讀取和轉換Excel數據。但是實際中Excel表格結構可能比較雜亂,數據會分散不同的工作表中,而且在表格中分布很亂,這種情況下啊直接使用pandas就會非常吃力。本文蟲蟲給大家介紹使用pandas和openpyxl讀取這樣的數據的方法。
  • 懶人秘籍:教你如何避免編寫pandas代碼
    而大家都在儘可能地避免這種懸崖峭壁,結果可想而知,都轉向了如何避免編寫pandas代碼。在過去4年裡,筆者一直使用pandas作為數據分析的主要工具。必須承認,「如何避免編寫pandas代碼」的大部分內容來自於使用pandas編程的起步階段。在進行代碼審閱時,筆者仍然看到許多經驗豐富的程式設計師在看一些熱門「如何避免使用」的帖子。
  • pandas庫中最重要的幾個知識點
    DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)參數解釋
  • 高效的5個pandas函數,你都用過嗎?
    之前為大家介紹過10個高效的pandas函數,頗受歡迎,裡面的每一個函數都能幫我們在數據分析過程中節省時間。高效的10個Pandas函數,你都用過嗎?pandas還有很多讓人舒適的用法,這次再為大家介紹5個pandas函數,作為這個系列的第二篇。1. explodeexplode用於將一行數據展開成多行。
  • PANDAS: 新手教程 一
    我將介紹Pandas的基本功能,這些功能將使你大致了解如何開始使用Pandas,以及它如何幫助你節省大量時間。高級-將通過高級的功能,使它更容易解決複雜的分析問題。它將涵蓋的主題,如風格,繪圖,讀取多個文件等。第二部分仍在進行中,敬請期待。在開始之前,確保你已經安裝了Pandas。如果沒有,你可以使用以下命令下載它。
  • 6個提升效率的pandas小技巧
    pandas是python中常用的數據分析庫,出現頻率非常高,而且pandas功能之多讓人咋舌,即使pandas老手也沒法保證能高效使用pandas做數據分析。這篇文章目的梳理幾個高效實用的pandas小技巧,供大家參考。1.
  • 使用Pandas的resample函數處理時間序列數據的技巧
    結果的行數將減少,並且可以使用mean()、min()、max()、sum()等聚合值。讓我們通過一個示例來了解它是如何工作的。假設我們有一個關於銷售的數據集。對於我們正在使用的銷售數據,第一個記錄的日期值為2017-01-02 09:02:03,因此將輸出範圍從09:00:00開始比從08:00開始更有意義。為此,我們可以使用參數base將聚合間隔的「原點」設置為不同的值,例如,set base=1,這樣結果範圍就可以從09:00:00開始。
  • 快速介紹Python數據分析庫pandas的基礎知識和代碼示例
    「軟體工程師閱讀教科書作為參考時不會記住所有的東西,但是要知道如何快速查找重要的知識點。」為了能夠快速查找和使用功能,使我們在進行機器學習模型時能夠達到一定流程化。我創建了這個pandas函數的備忘單。這不是一個全面的列表,但包含了我在構建機器學習模型中最常用的函數。讓我們開始吧!
  • Python數據分析利器,Pandas入門介紹,幫你便捷高效處理複雜數據
    pandas的矩陣運算可以幫我們結構化成表格數據,省去大量自己拼接表格數據的代碼開銷。本章知識點:pandas 安裝和使用pandas 數據結構(Series)pandas 數據結構(DataFrame)pandas 安裝和使用通過 pip install pandas可以直接安裝安裝pandas和相關聯的庫。
  • 如何用Pandas庫實現MySQL資料庫的讀寫?
    本次分享將介紹如何在Python中使用Pandas庫實現MySQL資料庫的讀寫。首先我們需要了解點ORM方面的知識。提供了SQL工具包及對象關係映射(ORM)工具,使用MIT許可證發行。
  • PANDAS: 新手教程 一 - 人工智慧遇見磐創
    我將介紹Pandas的基本功能,這些功能將使你大致了解如何開始使用Pandas,以及它如何幫助你節省大量時間。高級-將通過高級的功能,使它更容易解決複雜的分析問題。它將涵蓋的主題,如風格,繪圖,讀取多個文件等。第二部分仍在進行中,敬請期待。在開始之前,確保你已經安裝了Pandas。如果沒有,你可以使用以下命令下載它。
  • 如何通過一頓飯來說明NumPy與pandas的功用
    上圖展示了NumPy、pandas(以及matplotlib)的歷史總共下載量等信息。可以看出,兩者總共有過近80萬的下載量,如果按照市場價值計量,兩者合計價值近1500萬美元,但它們都可以免費使用。NumPy除了在相當程度上優化了Python計算過程,其自身還有較多的高級特性,如指定數組存儲的行優先或者列優先、廣播功能從而快速的對不同形狀的矩陣進行計算、ufunc類型的函數可以使得我們丟開循環而編寫出更為簡潔也更有效率的代碼、使用開源項目Numba編寫快速的NumPy函數,而Numba則是可以利用GPU進行運算的。
  • 從小白到大師,這裡有一份Pandas入門指南
    Pandas 是一個「開源的、有 BSD 開源協議的庫,它為 Python 程式語言提供了高性能、易於使用的數據架構以及數據分析工具」。總之,它提供了被稱為 DataFrame 和 Series(對那些使用 Panel 的人來說,它們已經被棄用了)的數據抽象,通過管理索引來快速訪問數據、執行分析和轉換運算,甚至可以繪圖(用 matplotlib 後端)。
  • 第5章 精通pandas合併操作(使用pandas進行數據分析,)
    ,則為列的交集)的交集下面舉一些例子說明其參數:df1 = pd.DataFrame({'A': ['A0', 'A1'],'B': ['B0', 'B1']},index = [0,1])df2 = pd.DataFrame({'A': ['A2', 'A3'],'B': ['B2', 'B3']},