色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

用這么久pandas才知道 category里的這些坑!

數據分析與開發 ? 來源:數據分析與開發 ? 作者:數據分析與開發 ? 2021-05-14 10:30 ? 次閱讀

pandas有一個特別的數據類型叫category,如其名一樣,是一種分類的數據類型。category很嬌氣,使用的時候稍有不慎就會進坑,因此本篇將介紹在pandas中,

1. 為什么要使用category?

2. 以及使用category時需要注意的一些坑!

文中使用的pandas版本為1.2.3,于今年2021年3月發布的。

為什么使用category數據類型?

總結一下,使用category有以下一些好處:

內存使用情況:對于重復值很多的字符串列,category可以大大減少將數據存儲在內存中所需的內存量;

運行性能:進行了一些優化,可以提高某些操作的執行速度

算法庫的適用:在某些情況下,一些算法模型需要category這種類型。比如,我們知道lightgbm相對于xgboost優化的一個點就是可以處理分類變量,而在構建模型時我們需要指定哪些列是分類變量,并將它們調整為category作為超參數傳給模型。

一個簡單的例子。

df_size = 100_000

df1 = pd.DataFrame(

{

“float_1”: np.random.rand(df_size),

“species”: np.random.choice([“cat”, “dog”, “ape”, “gorilla”], size=df_size),

}

df1_cat = df1.astype({“species”: “category”})

創建了兩個DataFrame,其中df1包含了species并且為object類型,df1_cat復制了df1,但指定了species為category類型。

》》 df1.memory_usage(deep=True)

Index 128

float_1 800000

species 6100448

dtype: int64

就內存使用而言,我們可以直接看到包含字符串的列的成本是多高。species列的字符串大約占用了6MB,如果這些字符串較長,則將會更多。

》》 df1_cat.memory_usage(deep=True)

Index 128

float_1 800000

species 100416

dtype: int64

再看轉換為category類別后的內存使用情況。有了相當大的改進,使用的內存減少了大約60倍。沒有對比,就沒有傷害。

這就是使用category的其中一個好處。但愛之深,責之切呀,使用它要格外小心。

使用category的一些坑!

一、category列的操作

好吧,這部分應該才是大家較為關心的,因為經常會遇到一些莫名其妙的報錯或者感覺哪里不對,又不知道問題出在哪里。

首先,說明一下:使用category的時候需要格外小心,因為如果姿勢不對,它就很可能變回object。而變回object的結果就是,會降低代碼的性能(因為強制轉換類型成本很高),并會消耗內存。

日常面對category類型的數據,我們肯定是要對其進行操作的,比如做一些轉換。下面看一個例子,我們要分別對category和object類型進行同樣的字符串大寫操作,使用accessor的.str方法。

在非category字符串上:

》》 %timeit df1[“species”].str.upper()

25.6 ms ± 2.07 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

在category字符串上:

》》 %timeit df1_cat[“species”].str.upper()

1.85 ms ± 41.1 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

結果很明顯了。在這種情況下,速度提高了大約14倍(因為內部優化會讓.str.upper()僅對分類的唯一類別值調用一次,然后根據結果構造一個seires,而不是對結果中的每個值都去調用一次)。

怎么理解?假設現有一個列叫animal,其類別有cat和dog兩種,假設樣本為10000個,4000個cat和6000個dog。那么如果我用對category本身處理,意味著我只分別對cat和dog兩種類別處理一次,一共兩次就解決。如果對每個值處理,那就需要樣本數量10000次的處理。

盡管從時間上有了一些優化,然而這種方法的使用也是有一些問題的。。??匆幌聝却媸褂们闆r。

》》 df1_cat[“species”].str.upper().memory_usage(deep=True)

6100576

意外的發現category類型丟了。。結果竟是一個object類型,數據壓縮的效果也沒了,現在的結果再次回到剛才的6MB內存占用。

這是因為使用str會直接讓原本的category類型強制轉換為object,所以內存占用又回去了,這是我為什么最開始說要格外小心。

解決方法就是:直接對category本身操作而不是對它的值操作。 要直接使用cat的方法來完成轉換操作,如下。

%timeit df1_cat[“species”].cat.rename_categories(str.upper)

239 μs ± 13.9 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

可以看到,這個速度就更快了,因為省去了將category類別轉換為object的時間,并且內存占用也非常少。因此,這才是最優的做法。

二、與category列的合并

還是上面那個例子,但是這次增加了habitat一列,并且species中增加了sanke。

df2 = pd.DataFrame(

{

“species”: [“cat”, “dog”, “ape”, “gorilla”, “snake”],

“habitat”: [“house”, “house”, “jungle”, “jungle”, “jungle”],

}

df2_cat = df2.astype({“species”: “category”, “habitat”: “category”})

和前面一樣,創建該數據集的一個category版本,并創建了一個帶有object字符串的版本。如果將兩個object列合并在一起的,沒什么意思,因為大家都知道會發生什么,object+ object= object而已。

把object列合并到category列上

還是一個例子。

》》 df1.merge(df2_cat, on=“species”).dtypes

float_1 float64

species object

habitat category

dtype: object

左邊的df1中species列為object,右邊的df2_cat中species列為category。我們可以看到,當我們合并時,在結果中的合并列會得到category+ object= object。

這顯然不行了,又回到原來那樣了。我們再試下其他情況。

兩個category列的合并

》》 df1_cat.merge(df2_cat, on=“species”).dtypes

float_1 float64

species object

habitat category

dtype: object

結果是:category+ category= object?

有點想打人了,但是別急,我們看看為啥。

在合并中,為了保存分類類型,兩個category類型必須是完全相同的。 這個與pandas中的其他數據類型略有不同,例如所有float64列都具有相同的數據類型,就沒有什么區分。

而當我們討論category數據類型時,該數據類型實際上是由該特定類別中存在的一組值來描述的,因此一個類別包含[“cat”, “dog”, “mouse”]與類別包含[“cheese”, “milk”, “eggs”]是不一樣的。上面的例子之所以沒成功,是因為多加了一個snake。

因此,我們可以得出結論:

category1+ category2=object

category1+ category1=category1

因此,解決辦法就是:兩個category類別一模一樣,讓其中一個等于另外一個。

》》 df1_cat.astype({“species”: df2_cat[“species”].dtype}).merge(

df2_cat, on=“species”

).dtypes

float_1 float64

species category

habitat category

dtype: object

三、category列的分組

用category類列分組時,一旦誤操作就會發生意外,結果是Dataframe會被填成空值,還有可能直接跑死。。

當對category列分組時,默認情況下,即使category類別的各個類不存在值,也會對每個類進行分組。

一個例子來說明。

habitat_df = (

df1_cat.astype({“species”: df2_cat[“species”].dtype})

.merge(df2_cat, on=“species”)

house_animals_df = habitat_df.loc[habitat_df[“habitat”] == “house”]

這里采用habitat_df,從上面例子得到的,篩選habitat為house的,只有dog和cat是house,看下面分組結果。

》》 house_animals_df.groupby(“species”)[“float_1”].mean()

species

ape NaN

cat 0.501507

dog 0.501023

gorilla NaN

snake NaN

Name: float_1, dtype: float64

在groupby中得到了一堆空值。默認情況下,當按category列分組時,即使數據不存在,pandas也會為該類別中的每個值返回結果。略坑,如果數據類型包含很多不存在的,尤其是在多個不同的category列上進行分組,將會極其損害性能。

因此,解決辦法是:可以傳遞observed=True到groupby調用中,這確保了我們僅獲取數據中有值的組。

》》 house_animals_df.groupby(“species”, observed=True)[“float_1”].mean()

species

cat 0.501507

dog 0.501023

Name: float_1, dtype: float64

四、category列的索引

仍以上面例子舉例,使用groupby-unstack實現了一個交叉表,species作為列,habitat作為行,均為category類型。

》》 species_df = habitat_df.groupby([“habitat”, “species”], observed=True)[“float_1”].mean().unstack()

》》 species_df

species cat ape dog gorilla

habitat

house 0.501507 NaN 0.501023 NaN

jungle NaN 0.501284 NaN 0.501108

這好像看似也沒什么毛病,我們繼續往下看。為這個交叉表添加一個新列new_col,值為1。

》》 species_df[“new_col”] = 1

TypeError: ‘fill_value=new_col’ is not present in this Categorical‘s categories

正常情況下,上面這段代碼是完全可以的,但這里報錯了,為什么?

原因是:species和habitat現在均為category類型。使用.unstack()會把species索引移到列索引中(類似pivot交叉表的操作)。而當添加的新列不在species的分類索引中時,就會報錯。

雖然平時使用時可能很少用分類作為索引,但是萬一恰巧用到了,就要注意一下了。

總結

總結一下,pandas的category類型非常有用,可以帶來一些良好的性能優勢。但是它也很嬌氣,使用過程中要尤為小心,確保category類型在整個流程中保持不變,避免變回object。本文介紹的4個點注意點:

category列的變換操作:直接對category本身操作而不是對它的值操作。這樣可以保留分類性質并提高性能。

category列的合并:合并時注意,要保留category類型,且每個dataframe的合并列中的分類類型必須完全匹配。

category列的分組:默認情況下,獲得數據類型中每個值的結果,即使數據中不存在該結果??梢酝ㄟ^設置observed=True調整。

category列的索引:當索引為category類型的時候,注意是否可能與類別變量發生奇怪的交互作用。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7006

    瀏覽量

    88958
  • 數據存儲
    +關注

    關注

    5

    文章

    970

    瀏覽量

    50901
  • 算法庫
    +關注

    關注

    0

    文章

    4

    瀏覽量

    1524

原文標題:用了一年 pandas,才知道 category 的這些坑!

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RAPIDS cuDF將pandas提速近150倍

    在 NVIDIA GTC 2024 上,NVIDIA 宣布,RAPIDS cuDF 當前已能夠為 950 萬 pandas 用戶帶來 GPU 加速,且無需修改代碼。
    的頭像 發表于 11-20 09:52 ?165次閱讀
    RAPIDS cuDF將<b class='flag-5'>pandas</b>提速近150倍

    aic23b的AD和DA輸入輸出數據總在64000左右,AD設置的是16位,為什么進來的數都這么大,是不是配置不對?

    你好,aic23b的AD和DA輸入輸出數據總在64000左右,AD設置的是16位,為什么進來的數都這么大,是不是配置不對? 還有就是,輸入電壓和采樣值之間的對應關系是什么?
    發表于 11-05 06:53

    opa627BP用來做前級放大,接地電阻多少合適?反饋電阻多少合適?

    你好,opa627BP 用來做前級放大,接地電阻多少合適,反饋電阻多少合適,謝謝
    發表于 10-31 07:38

    CATEGORY5e是什么網線

    CATEGORY 5e即CAT5e,指的是超五類網線。它是計算機網絡中常用的一種雙絞式電纜,也是數據、話音等信息通信業務使用的多媒體線材。以下是關于超五類網線的詳細介紹: 一、標識與類型 標識
    的頭像 發表于 10-23 10:23 ?921次閱讀

    使用PP3調試TAS5766M,初始化要超過三分鐘,是什么原因導致的?

    使用PP3調試 TAS5766M,為什么初始化要這么久,超過3分鐘,這不合理,煩請幫忙看一下是什么原因
    發表于 10-16 06:48

    4G模組SIM卡電路很簡單,但也要注意這些

    ?上次水SIM卡相關的文章,還是[上一次]; 上一篇文章吹牛說, 跟SIM卡相關的問題還有很多 ,目的是為下一篇文章埋下伏筆;伏筆埋是埋下了,但如果債老是不還,心里的石頭就總懸著,搞不好老板還要扣
    的頭像 發表于 09-30 07:01 ?776次閱讀
    4G模組SIM卡電路很簡單,但也要注意<b class='flag-5'>這些</b><b class='flag-5'>坑</b>

    為什么THS3001增益帶寬這么低?

    電路圖如上,我是根據手冊的電路改的,我把其中的滑動變阻器調為5倍固定增益,本來手冊的圖是有50ohm的輸出阻抗,我后面接的是射頻頭有50omh的阻抗,但是我測試電路100mv的輸入電壓
    發表于 08-23 08:29

    TL082I運放做了一個絕對值電路,有什么辦法可以縮短觸發的延遲時間?

    150uS,請群的大神幫忙分析下有什么辦法可以縮短觸發的延遲時間?是否TL082的處理時間就需要這么久,還是電路過于復雜導致處理時間延長?
    發表于 08-12 07:06

    讀了這么久的增益帶寬積竟然錯了?!

    。 這里有一個誤區,也是容易讓人迷惑的地方,雖然叫做增益帶寬積,但是做計算時的單位是放大倍數,而不是dB,所以增益帶寬積其實是等于開環放大倍數*頻率。 下面咱們直接通過一個示例理解增益帶寬積。下圖是OPA2333手冊的增益帶寬積GBW及其解讀。 手冊中的GBW是350KHz,這是什么
    的頭像 發表于 07-09 08:45 ?574次閱讀
    讀了<b class='flag-5'>這么久</b>的增益帶寬積竟然錯了?!

    ESP32-WROVER-B 16M固件的WiFi參數怎么設置算最優?

    有哪位大佬知道WiFi參數怎么設置算最優? 比如以下這些 CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM
    發表于 06-24 06:02

    新光光電:擬轉讓控股子公司中新光12.5%股權

    新光光電公告,公司擬向綿陽中光谷科技有限責任公司轉讓公司持有的控股子公司四川中新光科技有限公司12.5%股權,交易金額160.54萬元。
    的頭像 發表于 05-27 14:28 ?703次閱讀

    火了這么久的大模型,到底能為模組產業帶來什么?

    在AIGC時代浪潮下,美格智能也與芯片廠商及眾多下游客戶協同,不斷開展AIGC應用的研發和推廣,通過大模型與千行百業的深度融合,為傳統IoT、車載、機器人等行業創造新的價值。
    的頭像 發表于 03-15 17:43 ?307次閱讀

    火了這么久的大模型,到底能為模組產業帶來什么?

    全球新一輪產業技術變革加速來臨,大模型作為人工智能發展的核心引擎,正引發一場全新的工業革命,可能徹底改變人類社會的生產和生活方式。▌大模型:從橫空出世到百花齊放回顧上一年度,ChatGPT橫空出世,在全球范圍內掀起AIGC的發展熱潮。2024年,OpenAI繼續推出最新研究成果視頻生成大模型Sora,代表著大模型從靜態圖像生成到動態視頻創作的飛躍。近期,An
    的頭像 發表于 03-15 17:34 ?646次閱讀
    火了<b class='flag-5'>這么久</b>的大模型,到底能為模組產業帶來什么?

    ADUCM320i上電后需要等待大概60秒,請問什么情況下會導致上電需要等待這么久?

    相同代碼在EVAL-ADUCM320i上運行正常。但是在自己的PCBA上面上電需要等待大約60s,或者上電后P0.4(SCL0)給一個低電平,MCU開始執行代碼。 上電后MCU可以馬上通過IIC下載代碼,但不執行已經燒錄進去的代碼,請問什么情況會導致上電需要等待這么久?
    發表于 01-11 08:06

    華秋軟件登錄需要在上網行為管理開放哪些網址,

    我公司工程同事需要用到華秋軟件,以前一直沒有問題,最近升級到新版本,發現需要登錄。因為工程的電腦只能上微信和收發郵件,所以他們沒有辦法。 我想問一下,需要在上網行為管理開放哪些網址,可以讓華秋
    發表于 12-26 11:17
    主站蜘蛛池模板: 涩涩涩涩爱网站| 久久精品国产亚洲AV蜜臀| 99久久精品国产高清一区二区| 亚洲青青草| 亚洲AV无码国产精品色午夜情| 少妇伦子伦情品无吗| 日本一卡精品视频免费| 女人久久WWW免费人成看片| 蜜芽手机在线观看| 老师给美女同学开嫩苞| 久久精品国产在热亚洲完整版| 娇女的呻吟亲女禁忌h16| 国产在线观看成人免费视频| 国产欧美日韩亚洲第一页| 国产二区自拍| 国产精品igao视频网网址| 国产69精品久久久久乱码韩国| 大中国免费视频大全在线观看| 成3d漫二区三区四区| 成人国产在线不卡视频| 多人乱肉高hnp| 国产成人刺激视频在线观看| 国产精品18久久久久网站| 国产 有码 无码 电影| 高肉黄暴NP文公交车| 国产成人自产拍免费视频| 国产一级毛片在线| 精品久久久久亚洲| 久久午夜伦理| 农民下乡在线观看3| 日韩精品亚洲专区在线电影不卡| 色欲狠狠躁天天躁无码中文字幕| 受被攻做到腿发颤高h文| 亚洲AV无码专区国产乱码网站| 亚洲精品拍拍央视网出文| 用快播看黄的网站| 99久久伊人一区二区yy5o99| 白丝女仆被啪到深夜漫画| 国产精品久久人妻无码网站一区无| 国产永久视频| 老师在讲桌下边h边讲课|