chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

數(shù)據(jù)分析與開(kāi)發(fā) ? 來(lái)源:數(shù)據(jù)分析與開(kāi)發(fā) ? 作者:數(shù)據(jù)分析與開(kāi)發(fā) ? 2021-05-14 10:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1. 為什么要使用category?

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

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

為什么使用category數(shù)據(jù)類型?

總結(jié)一下,使用category有以下一些好處:

內(nèi)存使用情況:對(duì)于重復(fù)值很多的字符串列,category可以大大減少將數(shù)據(jù)存儲(chǔ)在內(nèi)存中所需的內(nèi)存量;

運(yùn)行性能:進(jìn)行了一些優(yōu)化,可以提高某些操作的執(zhí)行速度

算法庫(kù)的適用:在某些情況下,一些算法模型需要category這種類型。比如,我們知道lightgbm相對(duì)于xgboost優(yōu)化的一個(gè)點(diǎn)就是可以處理分類變量,而在構(gòu)建模型時(shí)我們需要指定哪些列是分類變量,并將它們調(diào)整為category作為超參數(shù)傳給模型。

一個(gè)簡(jiǎn)單的例子。

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”})

創(chuàng)建了兩個(gè)DataFrame,其中df1包含了species并且為object類型,df1_cat復(fù)制了df1,但指定了species為category類型。

》》 df1.memory_usage(deep=True)

Index 128

float_1 800000

species 6100448

dtype: int64

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

》》 df1_cat.memory_usage(deep=True)

Index 128

float_1 800000

species 100416

dtype: int64

再看轉(zhuǎn)換為category類別后的內(nèi)存使用情況。有了相當(dāng)大的改進(jìn),使用的內(nèi)存減少了大約60倍。沒(méi)有對(duì)比,就沒(méi)有傷害。

這就是使用category的其中一個(gè)好處。但愛(ài)之深,責(zé)之切呀,使用它要格外小心。

使用category的一些坑!

一、category列的操作

好吧,這部分應(yīng)該才是大家較為關(guān)心的,因?yàn)榻?jīng)常會(huì)遇到一些莫名其妙的報(bào)錯(cuò)或者感覺(jué)哪里不對(duì),又不知道問(wèn)題出在哪里。

首先,說(shuō)明一下:使用category的時(shí)候需要格外小心,因?yàn)槿绻藙?shì)不對(duì),它就很可能變回object。而變回object的結(jié)果就是,會(huì)降低代碼的性能(因?yàn)閺?qiáng)制轉(zhuǎn)換類型成本很高),并會(huì)消耗內(nèi)存。

日常面對(duì)category類型的數(shù)據(jù),我們肯定是要對(duì)其進(jìn)行操作的,比如做一些轉(zhuǎn)換。下面看一個(gè)例子,我們要分別對(duì)category和object類型進(jìn)行同樣的字符串大寫(xiě)操作,使用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)

結(jié)果很明顯了。在這種情況下,速度提高了大約14倍(因?yàn)閮?nèi)部?jī)?yōu)化會(huì)讓.str.upper()僅對(duì)分類的唯一類別值調(diào)用一次,然后根據(jù)結(jié)果構(gòu)造一個(gè)seires,而不是對(duì)結(jié)果中的每個(gè)值都去調(diào)用一次)。

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

盡管從時(shí)間上有了一些優(yōu)化,然而這種方法的使用也是有一些問(wèn)題的。。??匆幌聝?nèi)存使用情況。

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

6100576

意外的發(fā)現(xiàn)category類型丟了。。結(jié)果竟是一個(gè)object類型,數(shù)據(jù)壓縮的效果也沒(méi)了,現(xiàn)在的結(jié)果再次回到剛才的6MB內(nèi)存占用。

這是因?yàn)槭褂胹tr會(huì)直接讓原本的category類型強(qiáng)制轉(zhuǎn)換為object,所以內(nèi)存占用又回去了,這是我為什么最開(kāi)始說(shuō)要格外小心。

解決方法就是:直接對(duì)category本身操作而不是對(duì)它的值操作。 要直接使用cat的方法來(lái)完成轉(zhuǎn)換操作,如下。

%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)

可以看到,這個(gè)速度就更快了,因?yàn)槭∪チ藢ategory類別轉(zhuǎn)換為object的時(shí)間,并且內(nèi)存占用也非常少。因此,這才是最優(yōu)的做法。

二、與category列的合并

還是上面那個(gè)例子,但是這次增加了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”})

和前面一樣,創(chuàng)建該數(shù)據(jù)集的一個(gè)category版本,并創(chuàng)建了一個(gè)帶有object字符串的版本。如果將兩個(gè)object列合并在一起的,沒(méi)什么意思,因?yàn)榇蠹叶贾罆?huì)發(fā)生什么,object+ object= object而已。

把object列合并到category列上

還是一個(gè)例子。

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

float_1 float64

species object

habitat category

dtype: object

左邊的df1中species列為object,右邊的df2_cat中species列為category。我們可以看到,當(dāng)我們合并時(shí),在結(jié)果中的合并列會(huì)得到category+ object= object。

這顯然不行了,又回到原來(lái)那樣了。我們?cè)僭囅缕渌闆r。

兩個(gè)category列的合并

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

float_1 float64

species object

habitat category

dtype: object

結(jié)果是:category+ category= object?

有點(diǎn)想打人了,但是別急,我們看看為啥。

在合并中,為了保存分類類型,兩個(gè)category類型必須是完全相同的。 這個(gè)與pandas中的其他數(shù)據(jù)類型略有不同,例如所有float64列都具有相同的數(shù)據(jù)類型,就沒(méi)有什么區(qū)分。

而當(dāng)我們討論category數(shù)據(jù)類型時(shí),該數(shù)據(jù)類型實(shí)際上是由該特定類別中存在的一組值來(lái)描述的,因此一個(gè)類別包含[“cat”, “dog”, “mouse”]與類別包含[“cheese”, “milk”, “eggs”]是不一樣的。上面的例子之所以沒(méi)成功,是因?yàn)槎嗉恿艘粋€(gè)snake。

因此,我們可以得出結(jié)論:

category1+ category2=object

category1+ category1=category1

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

》》 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類列分組時(shí),一旦誤操作就會(huì)發(fā)生意外,結(jié)果是Dataframe會(huì)被填成空值,還有可能直接跑死。。

當(dāng)對(duì)category列分組時(shí),默認(rèn)情況下,即使category類別的各個(gè)類不存在值,也會(huì)對(duì)每個(gè)類進(jìn)行分組。

一個(gè)例子來(lái)說(shuō)明。

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,看下面分組結(jié)果。

》》 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中得到了一堆空值。默認(rèn)情況下,當(dāng)按category列分組時(shí),即使數(shù)據(jù)不存在,pandas也會(huì)為該類別中的每個(gè)值返回結(jié)果。略坑,如果數(shù)據(jù)類型包含很多不存在的,尤其是在多個(gè)不同的category列上進(jìn)行分組,將會(huì)極其損害性能。

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

》》 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實(shí)現(xiàn)了一個(gè)交叉表,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

這好像看似也沒(méi)什么毛病,我們繼續(xù)往下看。為這個(gè)交叉表添加一個(gè)新列new_col,值為1。

》》 species_df[“new_col”] = 1

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

正常情況下,上面這段代碼是完全可以的,但這里報(bào)錯(cuò)了,為什么?

原因是:species和habitat現(xiàn)在均為category類型。使用.unstack()會(huì)把species索引移到列索引中(類似pivot交叉表的操作)。而當(dāng)添加的新列不在species的分類索引中時(shí),就會(huì)報(bào)錯(cuò)。

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

總結(jié)

總結(jié)一下,pandas的category類型非常有用,可以帶來(lái)一些良好的性能優(yōu)勢(shì)。但是它也很嬌氣,使用過(guò)程中要尤為小心,確保category類型在整個(gè)流程中保持不變,避免變回object。本文介紹的4個(gè)點(diǎn)注意點(diǎn):

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

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

category列的分組:默認(rèn)情況下,獲得數(shù)據(jù)類型中每個(gè)值的結(jié)果,即使數(shù)據(jù)中不存在該結(jié)果??梢酝ㄟ^(guò)設(shè)置observed=True調(diào)整。

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

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7314

    瀏覽量

    93919
  • 數(shù)據(jù)存儲(chǔ)

    關(guān)注

    5

    文章

    1014

    瀏覽量

    52516
  • 算法庫(kù)
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    1694

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

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    那些年我OpenCV+Qt趟過(guò)哪些?寫(xiě)給視覺(jué)應(yīng)用開(kāi)發(fā)者的避指南

    前陣子,團(tuán)隊(duì)里新來(lái)的小伙子跑來(lái)找我,眉頭緊鎖。他手里的項(xiàng)目我清楚:一個(gè)基于攝像頭的簡(jiǎn)單計(jì)數(shù)工具。Demo階段Python+OpenCV,幾行代碼跑得飛快,準(zhǔn)確率也好看??梢坏┮虬山o產(chǎn)線工人
    發(fā)表于 12-02 09:43

    那些年我OpenCV+Qt趟過(guò)哪些?寫(xiě)給視覺(jué)應(yīng)用開(kāi)發(fā)者的避指南

    前陣子,團(tuán)隊(duì)里新來(lái)的小伙子跑來(lái)找我,眉頭緊鎖。他手里的項(xiàng)目我清楚:一個(gè)基于攝像頭的簡(jiǎn)單計(jì)數(shù)工具。Demo階段Python+OpenCV,幾行代碼跑得飛快,準(zhǔn)確率也好看??梢坏┮虬山o產(chǎn)線工人
    的頭像 發(fā)表于 12-02 09:40 ?72次閱讀
    那些年我<b class='flag-5'>用</b>OpenCV+Qt趟過(guò)哪些<b class='flag-5'>坑</b>?寫(xiě)給視覺(jué)應(yīng)用開(kāi)發(fā)者的避<b class='flag-5'>坑</b>指南

    “智匯瀟湘 聚湖南”成都、天津、深圳三城聯(lián)動(dòng),拓維信息引熱潮再升級(jí)!

    ,掀起一場(chǎng)“跨越千、迎鳳歸湘”的引熱潮。圖/拓維信息&TalkwebHouse雙通道引模式備受關(guān)注面向人工智能引領(lǐng)的產(chǎn)業(yè)變革浪潮,TalkwebHouse科創(chuàng)
    的頭像 發(fā)表于 11-10 18:20 ?452次閱讀
    “智匯瀟湘 <b class='flag-5'>才</b>聚湖南”成都、天津、深圳三城聯(lián)動(dòng),拓維信息引<b class='flag-5'>才</b>熱潮再升級(jí)!

    Hummingbirdv2 E203 仿真排之路

    simulation”部分,中途遇到很多,特來(lái)記錄一番。 1.環(huán)境設(shè)置 1.1 強(qiáng)烈建議 ubuntu 18.04,安裝時(shí)要點(diǎn)“下載更新” 我的是vmware 15.5pro虛擬機(jī)
    發(fā)表于 10-31 09:22

    以物聯(lián)網(wǎng)技術(shù)助力博物館智慧安防

    針對(duì)博物館安防與運(yùn)營(yíng)兩大核心需求,云打造全鏈條產(chǎn)品解決方案,先進(jìn)的物聯(lián)網(wǎng)智能硬件構(gòu)建無(wú)死角防護(hù)網(wǎng) 。
    的頭像 發(fā)表于 10-29 11:00 ?495次閱讀

    光模塊的「隱形功臣」:金手指憑什么這么關(guān)鍵?

    知道嗎?在光模塊的世界,有個(gè)不起眼卻至關(guān)重要的角色 —— 金手指。別看它只是光模塊尾部那排金光閃閃的觸點(diǎn),每一根都肩負(fù)著 “數(shù)據(jù)傳輸橋梁” 的重任。當(dāng)光模塊插入設(shè)備時(shí),金手指直接與接口咬合,把電信號(hào)穩(wěn)穩(wěn)當(dāng)當(dāng)傳輸出去。
    的頭像 發(fā)表于 09-10 16:31 ?609次閱讀
    光模塊<b class='flag-5'>里</b>的「隱形功臣」:金手指憑什么<b class='flag-5'>這么</b>關(guān)鍵?

    茂案例|解決工業(yè)物聯(lián)3大痛點(diǎn)!5G邊緣計(jì)算網(wǎng)關(guān)實(shí)戰(zhàn)來(lái)了!

    在工業(yè)4.0落地中,你是否常被這些問(wèn)題困擾:設(shè)備數(shù)據(jù)傳得慢、云端卡頓拖效率?現(xiàn)場(chǎng)電源、網(wǎng)絡(luò)設(shè)備零散,部署運(yùn)維費(fèi)工夫?老設(shè)備新系統(tǒng)協(xié)議不兼容,數(shù)據(jù)成“孤島”?廈門(mén)茂CM520系列5G邊緣計(jì)算網(wǎng)關(guān),
    的頭像 發(fā)表于 08-28 09:54 ?472次閱讀
    <b class='flag-5'>才</b>茂案例|解決工業(yè)物聯(lián)3大痛點(diǎn)!5G邊緣計(jì)算網(wǎng)關(guān)實(shí)戰(zhàn)來(lái)了!

    CSD船變壓器鐵芯硅鋼片,真能扛住鹽霧和振動(dòng)嗎?

    “船上的變壓器鐵芯,為什么老是被鹽霧腐蝕?”“振動(dòng)這么劇烈,硅鋼片會(huì)不會(huì)松散,噪音變大?”這些問(wèn)題,幾乎每天都會(huì)出現(xiàn)在船東、船廠和配套工程師的聊天群。大家心里都清楚:鐵芯一旦出問(wèn)題,整臺(tái)CSD船
    的頭像 發(fā)表于 08-23 09:44 ?561次閱讀
    CSD船<b class='flag-5'>用</b>變壓器鐵芯硅鋼片,真能扛住鹽霧和振動(dòng)嗎?

    【HZ-T536開(kāi)發(fā)板免費(fèi)體驗(yàn)】2、SDK編譯

    文件放置到對(duì)應(yīng)的板級(jí)配置目錄即可。 接下來(lái),就是按照文檔2.1節(jié)的內(nèi)容,按步驟仔細(xì)清理一下編譯產(chǎn)物,再跟著步驟編譯就可以了。 這里我踩了一個(gè),也就是我以前瑞芯微的SDK,還有自己編譯Linux
    發(fā)表于 07-31 18:37

    購(gòu)買機(jī)器人氣密性檢測(cè)儀:避指南和建議

    家人們,在工業(yè)生產(chǎn)中,機(jī)器人氣密性檢測(cè)儀是保證產(chǎn)品質(zhì)量的偉大貢獻(xiàn)者。然而,在購(gòu)買這個(gè)東西時(shí),也是一個(gè)接一個(gè)的。今天,我想談?wù)勅绾伪苊?b class='flag-5'>這些,并成功地購(gòu)買合適的檢測(cè)儀。(1)避開(kāi)精度虛標(biāo)的
    的頭像 發(fā)表于 06-23 13:56 ?348次閱讀
    購(gòu)買機(jī)器人氣密性檢測(cè)儀:避<b class='flag-5'>坑</b>指南和建議

    防水變壓器安裝總踩?這些要點(diǎn)不看虧大了!

    變壓器時(shí),到底該注意啥??船防水變壓器安裝與調(diào)試安裝船防水變壓器,第一步就得把“位置關(guān)”。咱都知道船上空間寸土寸金,跟“螺螄殼里做道場(chǎng)”似的。所以在方案階段,
    的頭像 發(fā)表于 06-20 10:23 ?494次閱讀
    船<b class='flag-5'>用</b>防水變壓器安裝總踩<b class='flag-5'>坑</b>?<b class='flag-5'>這些</b>要點(diǎn)不看虧大了!

    知道變壓器有哪些嗎?

    在船舶和海洋平臺(tái)上,電力系統(tǒng)的穩(wěn)定運(yùn)行至關(guān)重要,而船變壓器作為其中的關(guān)鍵設(shè)備,其種類繁多,各具特點(diǎn)。你知道變壓器有哪些嗎?讓我們一起來(lái)揭開(kāi)它們的神秘面紗。CSD船變壓器是船舶供
    的頭像 發(fā)表于 06-01 00:00 ?459次閱讀
    你<b class='flag-5'>知道</b>船<b class='flag-5'>用</b>變壓器有哪些嗎?

    電機(jī)產(chǎn)品在水泵行業(yè)的應(yīng)用

    在工業(yè)4.0與“雙碳”目標(biāo)的推動(dòng)下,水泵行業(yè)作為流體控制的核心領(lǐng)域,對(duì)節(jié)能高效的需求日益提升。電機(jī)作為水泵設(shè)備的心臟,其性能直接決定了水泵系統(tǒng)的效率、可靠性與成本。力電機(jī)圍繞水泵行業(yè)的核心痛點(diǎn)及需求,提供高效電機(jī)產(chǎn)品解決方案。
    的頭像 發(fā)表于 05-17 13:55 ?1113次閱讀

    公路路面病害(如裂縫、槽等)檢測(cè)

    公路路面病害(如裂縫、槽等)檢測(cè)
    的頭像 發(fā)表于 04-10 11:43 ?678次閱讀
    公路路面病害(如裂縫、<b class='flag-5'>坑</b>槽等)檢測(cè)

    正弦波FOC

    經(jīng)常在壇看到各種關(guān)于正弦波的討論,川辦畢竟也搞電機(jī)控制方案和成品產(chǎn)生這么久了,以下文檔,希望對(duì)大家有幫助。
    發(fā)表于 02-27 01:01