pandas冷門又很強大的技巧-cut

如果有一組數據,需要根據不同的範圍返回一個標籤,比如,一組成績,60分以下不合格,60-80:良,80-95:優秀,我們可以通過判斷來實現這個功能,但是如果讓你平均分成4份,可能就會稍微麻煩點,在pandas中提供了一個可以實現上述功能的方法:

cut

pandas冷門又很強大的技巧-cut

參數解釋:

pandas.cut

pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise')[source]

Bin值為離散間隔。

需要將數據值分段並排序到箱中時使用cut。 此函數對於從連續變量轉換為分類變量也很有用。 例如,cut可以將年齡轉換為年齡範圍組。 支持分箱到相同數量的箱櫃或預先指定的箱櫃陣列。

x : array-like

數組或者序列,但是必須是一維的

bins : int, sequence of scalars, or IntervalIndex

  • int:定義x範圍內的等寬bin的數量。 x的範圍在每一側擴展0.1%,以包括x的最小值和最大值。
  • 標量序列:定義bin邊緣,允許不均勻的寬度。 沒有擴展x的範圍。
  • IntervalIndex:定義要使用的精確bin。 請注意,bin的IntervalIndex必須不重疊。

right : bool, default True

指示是否包含最右邊。 如果right == True(默認值),則bin [1,2,3,4]表示(1,2], (2,3], (3,4]。當bin是IntervalIndex時,該參數被忽略。

labels : array or bool, optional

指定返回的bin的標籤。 必須與生成的箱櫃長度相同。 如果為False,則僅返回bin的整數指示符。 這會影響輸出容器的類型(見下文)。 當bin是IntervalIndex時,將忽略此參數。

retbins : bool, default False

表示是否將分割後的bins返回,當bins為一個int型的標量時比較有用,這樣可以得到劃分後的區間,默認為False。

precision : int, default 3

保留區間小數點的位數,默認為3.

include_lowest : bool, default False

bool型的參數,表示區間的左邊是開還是閉的,默認為false,也就是不包含區間左部(閉)。

duplicates : {default ‘raise’, ‘drop’}, optional

是否允許重複區間。有兩種選擇:raise:不允許,drop:允許。


返回值:

out:一個pandas.Categorical, Series或者ndarray類型的值,代表分區後x中的每個值在哪個bin(區間)中,如果指定了labels,則返回對應的label。

bins:分隔後的區間,當指定retbins為True時返回。


實例:

如果傳入的是一個數組:

pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3)

把它分成3份:

pandas冷門又很強大的技巧-cut

返回的是每個數據所在的區間

如果我們想看一下如何劃分區間的:

pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3, retbins=True)
pandas冷門又很強大的技巧-cut

如果想給每個劃分的區間設置一個標籤:

pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3, labels=["bad", "medium", "good"])
pandas冷門又很強大的技巧-cut

返回的就不在是對應的劃分區間,而是劃分區間對應的標籤,

需要注意的是標籤要和劃分的區間長度要相等

現在我們傳入一個序列

s = pd.Series(np.array([2, 4, 6, 8, 10]),
index=['a', 'b', 'c', 'd', 'e'])

現在分成3組:

pd.cut(s, 3)
pandas冷門又很強大的技巧-cut

查看分的組:

pd.cut(s, 3,retbins=True)
pandas冷門又很強大的技巧-cut

給每個分組添加標籤:

pd.cut(s, 3, labels=["bad", "medium", "good"])
pandas冷門又很強大的技巧-cut

如果傳入bins一個分好的組:

pd.cut(s, bins=[0, 2, 4, 6, 8, 10], labels=False, retbins=True, right=False)
pandas冷門又很強大的技巧-cut

接下來需要講一下分組的邊界問題:

主要涉及這幾個參數:right、include_lowestduplicates

right:默認為True

在默認情況下,每段值是不包含左邊的界值,包含右邊的界值(如上圖)。

如果我們要選擇左邊界,那麼只需要加一個參數:right = False就可以。

pandas冷門又很強大的技巧-cut

include_lowest:默認為FALSE

第一個間隔是否應該是包含在內

bins給定分組的第一個值是否包含在內,默認是不包含的,可以修改為True

pandas冷門又很強大的技巧-cut

duplicates:{default ‘raise’, ‘drop’}, optional

是否允許重複區間。有兩種選擇:raise:不允許,drop:允許。

pandas冷門又很強大的技巧-cut

擴展應用:groupby中利用cut分組當做分組的鍵:

新建數據:

df = pd.DataFrame({'Age': np.random.randint(20, 70, 100),
'Sex': np.random.choice(['Male', 'Female'], 100),
'number_of_foo': np.random.randint(1, 20, 100)})
df
pandas冷門又很強大的技巧-cut

利用分好的組當做分組的鍵:

age_groups = pd.cut(df['Age'], bins=[19,40,65,np.inf])
df.groupby(age_groups).mean()
pandas冷門又很強大的技巧-cut


分享到:


相關文章: