當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Python Pandas cut方法用法及代碼示例

Pandas cut(~) 方法將數值分類為箱(區間)。

參數

1. x | array-like

一個一維輸入數組,其數值將被分段到容器中。

2. bins | intsequence<scalar> IntervalIndex

bins 的指定類型決定了 bin 的計算方式:

類型

說明

int

equal-width bin 的數量。 x 的範圍增加 0.1%,以確保所有值都落入某個 bin 中。

sequence<scalar>

所需的 bin 邊。不屬於 bin 的值將設置為 NaN

IntervalIndex

要使用的確切箱子。

3. right | boolean | optional

是否排除左 bin 邊並包含右 bin 邊。默認情況下,right=True

4. labels | arrayFalse | optional

所需的箱子標簽。默認情況下,labels=None

5. retbins | boolean | optional

是否返回箱子。默認情況下,retbins=False

6. precision | int | optional

容器標簽中包含的小數位數。默認情況下,precision=3

7. include_lowest | boolean | optional

是否包含第一個 bin 的左邊。默認情況下,include_lowest=False

8. duplicates | string | optional

如何處理重複的 bin 邊:

說明

"raise"

如果設置了任何重複的 bin 邊,則會拋出錯誤。

"drop"

刪除重複的箱子邊並隻保留一個。

默認情況下,duplicates="raise"

9. ordered | boolean | optional | v1.10~

是否嵌入排序信息。僅當返回類型為數據類型 CategoricalCategoricalSeries 時,這才相關。如果提供了labels,則ordered 隻能設置為False。默認情況下,ordered=True

返回值

返回類型取決於labels參數的類型:

  • 如果labels未指定:

    • 如果 xSeries ,則返回對每個值的 bin 進行編碼的 Series 。每個 bin 間隔由 Interval 表示。

    • 否則,返回Categorical。每個 bin 間隔由 Interval 表示。

  • 如果 labels 是標量數組:

    • 如果 xSeries ,則返回 SeriesSeries 中存儲的值的類型與 labels 中存儲的值的類型匹配。

    • 否則,返回CategoricalCategorical 中存儲的值的類型與 labels 中存儲的值的類型匹配。

  • 如果 labels 是布爾值 False ,則返回一個 Numpy 整數數組。

如果 retbins=True ,則除了上述內容之外,容器還將作為 Numpy 數組返回。如果 x IntervalIndex ,則返回 x

例子

考慮以下有關學生及其成績的DataFrame:

raw_grades = [3,6,8,7,4,6]
students = ["alex", "bob", "cathy", "doge", "eric", "fred"]
df = pd.DataFrame({"name":students,"raw_grade":raw_grades})
df



   name  raw_grade
0  alex     3
1  bob      6
2  cathy    8
3  doge     7
4  eric     4
5  fred     6

基本用法

將原始等級分為四個箱(段):

df["grade"] = pd.cut(df["raw_grade"], bins=4)   # returns a Series
df



   name  raw_grade    grade
0  alex     3       (2.999, 4.5]
1  bob      6       (4.5, 6.0]
2  cathy    8       (6.75, 8.0]
3  doge     7       (6.75, 8.0]
4  eric     4       (2.999, 4.5]
5  fred     6       (4.5, 6.0]

grade 列現在包含 bin,總共應該有 4 不同的 bin。請注意, (2.995, 4.25] 僅表示 2.995 < raw_grade <= 4.25

指定自定義 bin 邊

要指定自定義 bin 邊,我們可以傳入 bin 邊數組而不是 int

df["grade"] = pd.cut(df["raw_grade"], bins=[0,4,6,10])
df



   name  raw_grade  grade
0  alex     3       (0, 4]
1  bob      6       (4, 6]
2  cathy    8       (6, 10]
3  doge     7       (6, 10]
4  eric     4       (0, 4]
5  fred     6       (4, 6]

我們在這裏展示相同的df供您參考:

df



   name  raw_grade
0  alex     3
1  bob      6
2  cathy    8
3  doge     7
4  eric     4
5  fred     6

指定權利

要使左 bin 邊包含在內且右 bin 邊不包含,請設置 right=False

df["grade"] = pd.cut(df["raw_grade"], bins=[0,4,6,10], right=False)
df



   name  raw_grade  grade
0  alex      3      [0, 4)
1  bob       6      [6, 10)
2  cathy     8      [6, 10)
3  doge      7      [6, 10)
4  eric      4      [4, 6)
5  fred      6      [6, 10)

請注意我們如何使用 [0, 4) 而不是默認的 (0, 4]

指定標簽

我們可以通過設置labels參數來為我們的箱子添加標簽:

df["grade"] = pd.cut(df["raw_grade"], bins=3, labels=["C","B","A"])
df



   name  raw_grade  grade
0  alex      3        C
1  bob       6        B
2  cathy     8        A
3  doge      7        A
4  eric      4        C
5  fred      6        B

這是cut(~) 方法的一個非常實用的函數。 labels 數組的長度必須等於指定的 bin 數量。

通過設置 labels=False ,返回 int 的 Numpy 數組:

raw_grades = [3,6,8,7,4,5]
pd.cut(raw_grades, bins=3, labels=False)



array([0, 1, 2, 2, 0, 1])

在這裏,輸出告訴我們:

  • 原始等級 3 屬於 bin 0(第一個 bin)。

  • 原始等級 6 屬於 bin 1(第二個 bin)。

  • 等等。

指定 retbins

要獲得計算的 bin 邊,請設置 retbins=True

raw_grades = [3,6,8,7,4,5]
res = pd.cut(raw_grades, bins=2, retbins=True)
print("Categories: ", res[0])
print("Bin egdes: ", res[1])



Categories:  [(2.995, 5.5], (5.5, 8.0], (5.5, 8.0], (5.5, 8.0], (2.995, 5.5], (2.995, 5.5]]
Categories (2, interval[float64]): [(2.995, 5.5] < (5.5, 8.0]]
Bin egdes:  [2.995 5.5   8.   ]

我們在這裏展示相同的df供您參考:

df



   name  raw_grade
0  alex     3
1  bob      6
2  cathy    8
3  doge     7
4  eric     4
5  fred     6

指定精度

要控製顯示多少位小數,請設置precision參數:

res = pd.cut(df["raw_grade"], bins=[0,4.33333,6.6,10], precision=2)
print(res)



0    (0.0, 4.33]
1    (4.33, 6.6]
2    (6.6, 10.0]
3    (6.6, 10.0]
4    (0.0, 4.33]
5    (4.33, 6.6]
Name: raw_grade, dtype: category
Categories (3, interval[float64]): [(0.0, 4.33] < (4.33, 6.6] < (6.6, 10.0]]

在這裏,請注意 4.3333 如何被截斷為 4.33 ,如 2precision 值所指定。

指定include_lowest

考慮以下:

df["grade"] = pd.cut(df["raw_grade"], bins=[3,6,10])
df



   name  raw_grade     grade
0  alex      3          NaN
1  bob       6       (3.0, 6.0]
2  ...

默認情況下, include_lowest=False ,這意味著第一個 bin 間隔是 left-exclusive。這就是為什麽 3 的 raw_grade 不屬於這裏的任何 bin 的原因。

我們可以通過設置 include_lowest=True 來設置第一個 bin 間隔 left-inclusive :

df["grade"] = pd.cut(df["raw_grade"], bins=[3,6,10], include_lowest=True)
df



   name  raw_grade       grade
0  alex      3        (2.999, 6.0]
1  bob       6        (2.999, 6.0]
...

我們現在看到 3raw_grade 已包含在第一個 bin 中。

指定重複項

默認情況下,bin 邊必須是唯一的,否則將引發錯誤。例如:

x = [3,7,8,7,4,5]
pd.cut(x, bins=[2,6,6,10])   # duplicates="raise"



ValueError: Bin edges must be unique: array([ 2,  6,  6, 10]).

在這裏,我們有兩個值 6 的 bin 邊,因此這就是我們收到錯誤的原因。

為了刪除(刪除)多餘的 bin 邊,請設置 duplicates="drop" ,如下所示:

x = [3,7,8,7,4,5]
pd.cut(x, bins=[2,6,6,10], duplicates="drop")



[(2, 6], (6, 10], (6, 10], (6, 10], (2, 6], (2, 6]]
Categories (2, interval[int64]): [(2, 6] < (6, 10]]

我們看到值 6 的 bin 邊之一被丟棄。

指定有序

默認情況下, ordered=True ,這意味著生成的 Categorical 將被排序:

grades = [3,6,8,7,4,5]
pd.cut(grades, bins=2, labels=["B","A"])   # ordered=True



['B', 'A', 'A', 'A', 'B', 'B']
Categories (2, object): ['B' < 'A']

請注意有關排序的信息如何嵌入為 ['B'<'A']

通過設置 ordered=False ,可以省略此類排序信息:

grades = [3,6,8,7,4,5]
pd.cut(grades, bins=2, labels=["B","A"], ordered=False)



['B', 'A', 'A', 'A', 'B', 'B']
Categories (2, object): ['B', 'A']

要設置 ordered=False ,請確保已指定 labels

相關用法


注:本文由純淨天空篩選整理自Isshin Inada大神的英文原創作品 Pandas | cut method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。