<bdo id="4g88a"><xmp id="4g88a">
  • <legend id="4g88a"><code id="4g88a"></code></legend>

    pandas DataFrame內存優化技巧:讓數據處理更高效

    Pandas無疑是我們數據分析時一個不可或缺的工具,它以其強大的數據處理能力、靈活的數據結構以及易于上手的API贏得了廣大數據分析師和機器學習工程師的喜愛。

    然而,隨著數據量的不斷增長,如何高效、合理地管理內存,確保Pandas DataFrame在運行時不會因內存不足而崩潰,成為我們每一個人必須面對的問題。

    在這個信息爆炸的時代,數據規模呈指數級增長,如何優化內存使用,不僅關乎到程序的穩定運行,更直接關系到數據處理的效率和準確性。通過本文,你將了解到一些實用的內存優化技巧,幫助你在處理大規模數據集時更加得心應手。

    1. 準備數據

    首先,準備一些包含各種數據類型的測試數據集。
    封裝一個函數(fake_data),用來生成數據集,數據集中包含后面用到的幾種字段。

    import pandas as pd
    import numpy as np
    
    def fake_data(size):
        """
        根據測試數據集:
        age:整數類型數值
        grade:有限個數的字符串
        qualified:是否合格
        ability:能力評估,浮點類型數值
        """
        df = pd.DataFrame()
        df["age"] = np.random.randint(1, 30, size)
        df["grade"] = np.random.choice(
            [
                "一年級",
                "二年級",
                "三年級",
                "四年級",
                "五年級",
                "六年級",
            ],
            size,
        )
        df["qualified"] = np.random.choice(["合格", "不合格"], size)
        df["ability"] = np.random.uniform(0, 1, size)
    
        return df
    

    2. 檢測內存占用

    使用上面封裝的函數(fake_data)先構造一個包含一百萬條數據的DataFrame。

    df = fake_data(1_000_000)
    df.head()
    

    image.png

    看看優化前的內存占用情況:

    df.info()
    

    image.png
    內存占用大約 26.7MB 左右。

    3. 優化內存

    接下來,我們開始一步步優化DataFrame的內存占用,
    并測試每一步優化之后的內存使用情況和運行性能變化。

    3.1. 優化整型數據

    首先,優化整型數據的內存占用,也就是測試數據中的年齡age)字段。
    從上面df.info()的結果中,我們可以看出,age的類型是int32(也就是用32位,8個字節來存儲整數)。
    對于年齡來說,用不到這么大的整數,用int8(數值范圍:-128~127)來存儲綽綽有余。

    df["age"] = df["age"].astype("int8")
    df.info()
    

    image.png
    優化之后,內存占用從26.7+ MB減到23.8+ MB。

    3.2. 優化浮點型數據

    接下來優化浮點類型數據,也就是測試數據中的能力評估值ability)。
    測試數據中ability的值是6位小數,類型是float64,
    轉換成float16可能會改變值,所以這里轉換成float32。

    df["ability"] = df["ability"].astype("float32")
    df.info()
    

    image.png
    優化之后,內存占用進一步從23.8+ MB減到20.0+ MB。

    3.3. 優化布爾型數據

    接下來,優化測試數據中的是否合格qualified),
    這個值雖然是字符串類型,但是它的值只有兩種(合格不合格),所以可以轉換成布爾類型。

    df["qualified"] = df["qualified"].map({"合格": True, "不合格": False})
    df.info()
    

    image.png
    優化之后,內存占用進一步從20.0+ MB減到13.4+ MB。

    3.4. 使用category類型

    最后,我們再優化剩下的字段--年級grade)。

    這個字段也是字符串,不過它的值只有6個,雖然無法轉換成布爾類型(布爾類型只有兩種值TrueFalse),但是它可以轉換為pandas中的 category 類型。

    df["grade"] = df["grade"].astype("category")
    df.info()
    

    image.png
    優化之后,內存占用進一步從13.4+ MB減到6.7+ MB。

    4. 總結

    各類字段優化之后,內存占用從剛開始的26.7+ MB減到6.7+ MB,優化的效果非常明顯。

    僅僅是數據類型的簡單調整,就帶來了如此之大的內存效率提升,
    這也給我們帶來啟示,在數據分析的過程中,構造DataFrame時,也可以根據數值的范圍,特點等,
    來賦予它合適的類型,不要一味簡單的使用字符串,或者默認的整數(int32),默認的浮點(float64)等類型。

    posted @ 2024-03-14 13:25  wang_yb  閱讀(705)  評論(0編輯  收藏  舉報
    免费视频精品一区二区_日韩一区二区三区精品_aaa在线观看免费完整版_世界一级真人片
    <bdo id="4g88a"><xmp id="4g88a">
  • <legend id="4g88a"><code id="4g88a"></code></legend>