您當前的位置:首頁 > 舞蹈

資料分箱之pd.cut()

作者:由 敲來敲去 發表于 舞蹈時間:2020-05-26

相信很多進行資料處理工作的小夥伴都遇到過這種需求,比如已經有了各個銷售員的銷售業績,現在需要給各個銷售業績進行一個分檔,諸如未完成任務,完成任務,超額完成任務等。要完成分檔需要先對銷售業績的數值進行判斷,然後再根據判斷的結果進行一個分類,那麼大家都是怎樣進行分類的呢?

實際上,上述需求是要對連續型的數值進行分箱操作,實現的方法有N種,但是效率有高有低,這裡我們介紹一種效率比較高而且也容易理解的方法,運用DataFrame種的一個函式,叫做pd。cut()實現分箱操作。

pd.cut()引數介紹

先來看一下這個函式都包含有哪些引數,主要引數的含義與作用都是什麼?

pd。cut( x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates=‘raise’, )

x : 一維陣列(對應前邊例子中提到的銷售業績)

bins :整數,標量序列或者間隔索引,是進行分組的依據,

如果填入整數n,則表示將x中的數值分成等寬的n份(即每一組內的最大值與最小值之差約相等);

如果是標量序列,序列中的數值表示用來分檔的分界值

如果是間隔索引,“ bins”的間隔索引必須不重疊

right :布林值,預設為True表示包含最右側的數值

當“ right = True”(預設值)時,則“ bins”=[1、2、3、4]表示(1,2],(2,3],(3,4]

bins

是一個間隔索引時,該引數被忽略。

labels : 陣列或布林值,可選。指定分箱的標籤

如果是陣列,長度要與分箱個數一致,比如“ bins”=[1、2、3、4]表示(1,2],(2,3],(3,4]一共3個區間,則labels的長度也就是標籤的個數也要是3

如果為False,則僅返回分箱的整數指示符,即x中的資料在第幾個箱子裡

當bins是間隔索引時,將忽略此引數

retbins: 是否顯示分箱的分界值。預設為False,當bins取整數時可以設定retbins=True以顯示分界值,得到劃分後的區間

precision:整數,預設3,儲存和顯示分箱標籤的精度。

include_lowest:布林值,表示區間的左邊是開還是閉,預設為false,也就是不包含區間左邊。

duplicates:如果分箱臨界值不唯一,則引發ValueError或丟棄非唯一

ok,所有引數的含義與作用就是這些了,純文字解釋怎麼都不如程式碼跑一遍來的直觀,我們在程式碼中實現一下再結合上述文字解釋就很容易理解了。而且並不是所有引數都是常用的,有些引數很少用到!

pd.cut()程式碼示例

先來看一下資料來源

df_f = pd。read_excel(r“D:\data\football\球隊排名比分2019。xlsx”)

df_f

讀入的資料是2019年英超各球隊的積分:

資料分箱之pd.cut()

進行分箱

bins取整數,即指定箱子個數

我們對積分資料進行分箱,先來最簡單的:

pd。cut(df_f。積分,bins=3,labels=[“低”,“中”,“高”]) #分成3箱並指定標籤

分箱結果:

0 高

1 高

2 中

3 中

4 中

5 中

6 中

7 中

8 低

9 低

10 低

11 低

12 低

13 低

14 低

15 低

16 低

17 低

18 低

19 低

Name: 積分, dtype: category

Categories (3, object): [低 < 中 < 高]

直接指定箱子個數,分成等寬的3份,感興趣的同學可以求一下每個箱子內的極值,應該是約相等的。

前邊有提到,這種分箱方式看不到分界值是多少,但是可以透過引數進行設定顯示分界值:

pd。cut(df_f。積分,3,labels=[“低”,“中”,“高”],retbins=True) #retbins=True顯示分界值

分箱結果:

(0 高

1 高

2 中

3 中

4 中

5 中

6 中

7 中

8 低

9 低

10 低

11 低

12 低

13 低

14 低

15 低

16 低

17 低

18 低

19 低

Name: 積分, dtype: category

Categories (3, object): [低 < 中 < 高],

array([13。953 , 29。66666667, 45。33333333, 61。 ]))

是不是能明顯的看出和上一次程式碼結果相比多了一個 array([13。953 , 29。66666667, 45。33333333, 61。 ]),這就是分箱的分界值啦,我們就能知道分箱的時候是以那個數值作為分界點進行分箱的了。

如果不指定每個箱子的標籤是什麼

pd。cut(df_f。積分,3,labels=False) #只顯示資料位於第幾個箱子裡

分享結果:

0 2

1 2

2 1

3 1

4 1

5 1

6 1

7 1

8 0

9 0

10 0

11 0

12 0

13 0

14 0

15 0

16 0

17 0

18 0

19 0

Name: 積分, dtype: int64

只顯示每個位置上的數值屬於第幾個箱子

bins取標量序列

pd。cut(df_f。積分,[0,30,40,70],labels=[“低”,“中”,“高”]) #預設right = True

指定分箱時候的分界點,即0~30,30~40,40~70一共三個箱體,有預設的right = True,即分箱的時候,30包含在0~30的箱體中,40包含在30~40的箱體中,70包含在40~70的箱體中,我們來看下結果,是不是和描述一致:

資料分箱之pd.cut()

這裡紅框部分是要和下邊更改引數right後的結果進行對比的,我們來看下:

pd。cut(df_f。積分,[0,30,40,70],labels=[“低”,“中”,“高”],right=False)

分箱結果:

資料分箱之pd.cut()

能夠看到,right引數設定對分箱結果的影響。為什麼會有這樣的影響呢?我們回顧下我們的原資料:

資料分箱之pd.cut()

能夠發現分享發生變化的數值正好是我們分箱的臨界值,可以透過引數進行設定臨界值被劃分到哪一邊的箱體中。

如果需要將分箱的結果展示在原資料框中,直接賦值一列進去就可以了:

df_f。loc[:,“積分等級”]=pd。cut(df_f。積分,[0,30,40,70],labels=[“低”,“中”,“高”],right=False)

df_f

結果如下:

資料分箱之pd.cut()

對於pd。cut()函式常用的引數設定就是這些了,小夥伴們還有哪些疑問或者新發現歡迎一起討論啊!

標簽: 分箱  Pd  Cut  bins  df