預生成随機資料
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
df = create_df()
df.head()
score | |
63 | |
1 | 21 |
2 | 76 |
3 | |
4 |
between & loc
Pandas .between 方法傳回一個包含 True 的布爾向量,用來對應的 Series 元素位于邊界值 left 和 right[1] 之間。
參數有下面三個:
left:左邊界
right:右邊界
inclusive:要包括哪個邊界。可接受的值為 {“both”、“neither”、“left”、“right”}。
根據以下間隔規則将學生的分數分為等級:
A: (80, 100]
B: (50, 80]
C: [0, 50]
其中方括号 [ 和圓括号 ) 分别表示邊界值是包含的和不包含的。我們需要确定哪個分數在感興趣的區間之間,并為其配置設定相應的等級值。注意看下面的不同的參數表示是否包含邊界
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'
df
score | grade | |
63 | B | |
1 | 21 | C |
2 | 76 | B |
3 | C | |
4 | C | |
... | ... | ... |
995 | 39 | C |
996 | 71 | B |
997 | 64 | B |
998 | 57 | B |
999 | 84 | A |
1000 rows × 2 columns
df.grade.value_counts()
C 490
B 313
A 197
Name: grade, dtype: int64
cut
可以使用 cut将值分類為離散的間隔。此函數對于從連續變量到分類變量[2] 也很有用。
cut的參數如下:
x:要分箱的數組。必須是一維的。
bins:标量序列:定義允許非均勻寬度的 bin 邊緣。
labels:指定傳回的 bin 的标簽。必須與上面的 bins 參數長度相同。
include_lowest: (bool) 第一個區間是否應該是左包含的。
bins = [0, 50, 80, 100]
labels = ['C', 'B', 'A']
df['grade'] = pd.cut(x = df['score'], bins = bins, labels = labels, include_lowest = True)
df.grade.value_counts()
C 498
B 312
A 190
Name: grade, dtype: int64
qcut
qcut可以根據排名或基于樣本分位數将變量離散為大小相等的桶[3]。
在前面的示例中,我們為每個級别定義了分數間隔,這回使每個級别的學生數量不均勻。在下面的示例中,我們将嘗試将學生分類為 3 個具有相等(大約)數量的分數等級。示例中有 1000 名學生,是以每個分箱應該有大約 333 名學生。
qcut參數:
x:要分箱的輸入數組。必須是一維的。
q:分位數。10 表示十分位數,4 表示四分位數等。也可以是交替排列的分位數,例如[0, .25, .5, .75, 1.] 四分位數。
labels:指定 bin 的标簽。必須與生成的 bin 長度相同。
retbins: (bool) 是否傳回 (bins, labels)。
df['grade'], cut_bin = pd.qcut(df['score'], q = 3, labels = ['C', 'B', 'A'], retbins = True)
df.head()
score | grade | |
63 | B | |
1 | 21 | C |
2 | 76 | A |
3 | C | |
4 | C |
# 如果 retbins 設定為 True 則會傳回 bin 邊界。
print (cut_bin)
[ 0. 32. 67. 100.]
df.grade.value_counts()
B 339
C 334
A 327
Name: grade, dtype: int64
value_counts
df['score'].value_counts(bins = 3, sort = False)
(-0.101, 33.333] 346
(33.333, 66.667] 320
(66.667, 100.0] 334
Name: score, dtype: int64
df['score'].value_counts(bins = [0,50,80,100], sort = False)
(-0.001, 50.0] 498
(50.0, 80.0] 312
(80.0, 100.0] 190
Name: score, dtype: int64