<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Pandas 對(duì)數(shù)值進(jìn)行分箱操作的 4 種方法

          共 3317字,需瀏覽 7分鐘

           ·

          2022-06-06 16:41

          推薦關(guān)注↓

          箱是一種常見(jiàn)的數(shù)據(jù)預(yù)處理技術(shù)有時(shí)也被稱(chēng)為分桶或離散化,他可用于將連續(xù)數(shù)據(jù)的間隔分組到“箱”或“桶”中。

          在本文中,我們將討論使用 python Pandas 庫(kù)對(duì)數(shù)值進(jìn)行分箱的 4 種方法。

          我們創(chuàng)建以下合成數(shù)據(jù)用于演示

          import?pandas?as?pd?#?version?1.3.5?
          import?numpy?as?np?
          def?create_df():?
          ?df?=?pd.DataFrame({'score':?np.random.randint(0,101,1000)})?
          ?return?df?
          ?
          create_df()?
          df.head()

          數(shù)據(jù)包括 1000 名學(xué)生的 0 到 100 分的考試分?jǐn)?shù)。而這次的任務(wù)是將數(shù)字分?jǐn)?shù)分為值“A”、“B”和“C”的等級(jí),其中“A”是最好的等級(jí),“C”是最差的等級(jí)。

          1、between & loc

          Pandas .between 方法返回一個(gè)包含 True 的布爾向量,用來(lái)對(duì)應(yīng)的 Series 元素位于邊界值 left 和 right 之間。

          參數(shù)有下面三個(gè):

          • left:左邊界
          • right:右邊界
          • inclusive:要包括哪個(gè)邊界。可接受的值為 {“both”、“neither”、“l(fā)eft”、“right”}。

          根據(jù)以下間隔規(guī)則將學(xué)生的分?jǐn)?shù)分為等級(jí):

          • A: (80, 100]
          • B: (50, 80]
          • C: [0, 50]

          其中方括號(hào) [ 和圓括號(hào) ) 分別表示邊界值是包含的和不包含的。我們需要確定哪個(gè)分?jǐn)?shù)在感興趣的區(qū)間之間,并為其分配相應(yīng)的等級(jí)值。注意看下面的不同的參數(shù)表示是否包含邊界

          df.loc[df['score'].between(0,?50,?'both'),?'grade']?=?'C'?
          df.loc[df['score'].between(50,?80,?'right'),?'grade']?=?'B'?
          df.loc[df['score'].between(80,?100,?'right'),?'grade']?=?'A'

          以下是每個(gè)分?jǐn)?shù)區(qū)間的人數(shù):

          df.grade.value_counts()
          C    488
          B 310
          A 202
          Name: grade, dtype: int64

          此方法需要為每個(gè) bin 編寫(xiě)處理的代碼,因此它僅適用于 bin 很少的情況。

          2、cut

          可以使用 cut將值分類(lèi)為離散的間隔。此函數(shù)對(duì)于從連續(xù)變量到分類(lèi)變量也很有用。

          cut的參數(shù)如下:

          • x:要分箱的數(shù)組。必須是一維的。
          • bins:標(biāo)量序列:定義允許非均勻?qū)挾鹊?bin 邊緣。
          • labels:指定返回的 bin 的標(biāo)簽。必須與上面的 bins 參數(shù)長(zhǎng)度相同。
          • include_lowest: (bool) 第一個(gè)區(qū)間是否應(yīng)該是左包含的。
          bins?=?[0,?50,?80,?100]?
          labels?=?['C',?'B',?'A']?
          df['grade']?=?pd.cut(x?=?df['score'],?
          ??????????????????????bins?=?bins,?
          ??????????????????????labels?=?labels,?
          ??????????????????????include_lowest?=?True)

          這樣就創(chuàng)建一個(gè)包含 bin 邊界值的 bins 列表和一個(gè)包含相應(yīng) bin 標(biāo)簽的標(biāo)簽列表。

          查看每個(gè)區(qū)段的人數(shù)

          df.grade.value_counts()
          C    488
          B 310
          A 202
          Name: grade, dtype: int64

          結(jié)果與上面示例相同。

          3、qcut

          qcut可以根據(jù)排名或基于樣本分位數(shù)將變量離散為大小相等的桶[3]。

          在前面的示例中,我們?yōu)槊總€(gè)級(jí)別定義了分?jǐn)?shù)間隔,這回使每個(gè)級(jí)別的學(xué)生數(shù)量不均勻。在下面的示例中,我們將嘗試將學(xué)生分類(lèi)為 3 個(gè)具有相等(大約)數(shù)量的分?jǐn)?shù)等級(jí)。示例中有 1000 名學(xué)生,因此每個(gè)分箱應(yīng)該有大約 333 名學(xué)生。

          qcut參數(shù):

          • x:要分箱的輸入數(shù)組。必須是一維的。
          • q:分位數(shù)。10 表示十分位數(shù),4 表示四分位數(shù)等。也可以是交替排列的分位數(shù),例如[0, .25, .5, .75, 1.] 四分位數(shù)。
          • labels:指定 bin 的標(biāo)簽。必須與生成的 bin 長(zhǎng)度相同。
          • retbins: (bool) 是否返回 (bins, labels)。
          df['grade'],?cut_bin?=?pd.qcut(df['score'],?
          ??????????????????????????q?=?3,?
          ??????????????????????????labels?=?['C',?'B',?'A'],?
          ??????????????????????????retbins?=?True)?
          df.head()

          如果 retbins 設(shè)置為 True 則會(huì)返回 bin 邊界。

          print?(cut_bin)?
          >>?[??0.??36.??68.?100.]

          分?jǐn)?shù)間隔如下:

          • C:[0, 36]
          • B:(36, 68]
          • A:(68, 100]

          使用 .value_counts() 檢查每個(gè)等級(jí)有多少學(xué)生。理想情況下,每個(gè)箱應(yīng)該有大約 333 名學(xué)生。

          df.grade.value_counts()
          C    340
          A 331
          B 329
          Name: grade, dtype: int64

          4、value_counts

          雖然 pandas .value_counts 通常用于計(jì)算系列中唯一值的數(shù)量,但它也可用于使用 bins 參數(shù)將值分組到半開(kāi)箱中。

          df['score'].value_counts(bins?=?3,?sort?=?False)

          默認(rèn)情況下, .value_counts 按值的降序?qū)Ψ祷氐南盗羞M(jìn)行排序。將 sort 設(shè)置為 False 以按其索引的升序?qū)ο盗羞M(jìn)行排序。

          (-0.101, 33.333]    310
          (33.333, 66.667] 340
          (66.667, 100.0] 350
          Name: score, dtype: int64

          series 索引是指每個(gè) bin 的區(qū)間范圍,其中方括號(hào) [ 和圓括號(hào) ) 分別表示邊界值是包含的和不包含的。返回series 的值表示每個(gè) bin 中有多少條記錄。

          與 .qcut 不同,每個(gè) bin 中的記錄數(shù)不一定相同(大約)。.value_counts 不會(huì)將相同數(shù)量的記錄分配到相同的類(lèi)別中,而是根據(jù)最高和最低分?jǐn)?shù)將分?jǐn)?shù)范圍分成 3 個(gè)相等的部分。分?jǐn)?shù)的最小值為 0,最大值為 100,因此這 3 個(gè)部分中的每一個(gè)都大約在 33.33 范圍內(nèi)。這也解釋了為什么 bin 的邊界是 33.33 的倍數(shù)。

          我們還可以通過(guò)傳入邊界列表來(lái)定義 bin 邊界。

          df['score'].value_counts(bins?=?[0,50,80,100],?sort?=?False)
          (-0.001, 50.0]    488
          (50.0, 80.0] 310
          (80.0, 100.0] 202
          Name: score, dtype: int64

          這給了我們與示例 1 和 2 相同的結(jié)果。

          總結(jié)

          在本文中,介紹了如何使用 .between、.cut、.qcut 和 .value_counts 對(duì)連續(xù)值進(jìn)行分箱。這里是本文的源代碼:

          [1]

          來(lái)源:?https://colab.research.google.com/drive/1yWTl2OzOnxG0jCdmeIN8nV1MoX3KQQ_1%3Fusp%3Dsharing

          長(zhǎng)按或掃描下方二維碼,后臺(tái)回復(fù):加群,即可申請(qǐng)入群。一定要備注:來(lái)源+研究方向+學(xué)校/公司,否則不拉入群中,見(jiàn)諒!

          長(zhǎng)按三秒,進(jìn)入后臺(tái)


          推薦閱讀

          瀏覽 43
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  给我播放欧洲成人在线 | 国产女人精品在线 | 日韩中文字幕区 | 想要XX网站入口 | 国产精品九九99久久精品 |