資料分箱之pd.cut()
相信很多進行資料處理工作的小夥伴都遇到過這種需求,比如已經有了各個銷售員的銷售業績,現在需要給各個銷售業績進行一個分檔,諸如未完成任務,完成任務,超額完成任務等。要完成分檔需要先對銷售業績的數值進行判斷,然後再根據判斷的結果進行一個分類,那麼大家都是怎樣進行分類的呢?
實際上,上述需求是要對連續型的數值進行分箱操作,實現的方法有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年英超各球隊的積分:
進行分箱
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的箱體中,我們來看下結果,是不是和描述一致:
這裡紅框部分是要和下邊更改引數right後的結果進行對比的,我們來看下:
pd。cut(df_f。積分,[0,30,40,70],labels=[“低”,“中”,“高”],right=False)
分箱結果:
能夠看到,right引數設定對分箱結果的影響。為什麼會有這樣的影響呢?我們回顧下我們的原資料:
能夠發現分享發生變化的數值正好是我們分箱的臨界值,可以透過引數進行設定臨界值被劃分到哪一邊的箱體中。
如果需要將分箱的結果展示在原資料框中,直接賦值一列進去就可以了:
df_f。loc[:,“積分等級”]=pd。cut(df_f。積分,[0,30,40,70],labels=[“低”,“中”,“高”],right=False)
df_f
結果如下:
對於pd。cut()函式常用的引數設定就是這些了,小夥伴們還有哪些疑問或者新發現歡迎一起討論啊!
上一篇:懷化-吉首到底搭什麼車回家
下一篇:硬筆行書每日一字 線