高效使用pandas的value counts()

從 YTYZX有图有真相的百科
於 2022年3月20日 (日) 18:34 由 Ytyzx (對話 | 貢獻) 所做的修訂 (创建页面,内容为“数据科学家通常将大部分时间花在探索和预处理数据上。当谈到数据分析和理解数据结构时,Pandas value_counts() 是最受欢迎的...”)
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
跳到: 導覽搜尋

數據科學家通常將大部分時間花在探索和預處理數據上。當談到數據分析和理解數據結構時,Pandas value_counts() 是最受歡迎的函數之一。該函數返回一個包含唯一值計數的系列。生成的Series可以按降序或升序排序,通過參數控制包括或排除NA。

在本文中,我們將探討 Pandas value_counts() 的不同用例。您將學習如何使用它來處理以下常見任務。

默認參數 按升序對結果進行排序 按字母順序排列結果 結果中包含空值 以百分比計數顯示結果 將連續數據分入離散區間 分組並調用 value_counts() 將結果系列轉換為 DataFrame 應用於DataFrame 1、默認參數 Pandas value_counts() 函數返回一個包含唯一值計數的系列。默認情況下,結果系列按降序排列,不包含任何 NA 值。例如,讓我們從 Titanic 數據集中獲取「Embarked」列的計數。

>>> df['Embarked'].value_counts()

S    644
C    168
Q     77
Name: Embarked, dtype: int64

2、按升序對結果進行排序 value_count() 返回的系列默認按降序排列。對於升序結果,我們可以將參數升序設置為 True。

>>> df['Embarked'].value_counts(ascending=True)

Q     77
C    168
S    644
Name: Embarked, dtype: int64

3、按字母順序排列結果 我們已經學習了參數升序以獲得按值計數 ASC 或 DESC 排序的結果。在某些情況下,最好按字母順序顯示我們的結果。這可以通過在 value_counts() 之後調用 sort_index(ascending=True) 來完成,例如

>>> df['Embarked'].value_counts(ascending=True).sort_index(ascending=True)

C    168
Q     77
S    644
Name: Embarked, dtype: int64

4、包括結果中的 NA 默認情況下,結果中會忽略包含任何 NA 值的行。有一個參數 dropna 來配置它。我們可以將該值設置為 False 以包含 NA 的行數。

df['Embarked'].value_counts(dropna=False)
S      644
C      168
Q       77
NaN      2
Name: Embarked, dtype: int64

5、以百分比計數顯示結果 在進行探索性數據分析時,有時查看唯一值的百分比計數會更有用。這可以通過將參數 normalize 設置為 True 來完成,例如:

df['Embarked'].value_counts(normalize=True)

S    0.724409
C    0.188976
Q    0.086614
Name: Embarked, dtype: float64

如果我們更喜歡用百分號 (%) 格式化結果,我們可以設置 Pandas 顯示選項如下:

>>> pd.set_option('display.float_format', '{:.2f}%'.format)
>>> df['Embarked'].value_counts(normalize = True)

S   0.72%
C   0.19%
Q   0.09%
Name: Embarked, dtype: float64

6、將連續數據分入離散區間 Pandas value_counts() 可用於使用 bin 參數將連續數據分入離散區間。與 Pandas cut() 函數類似,我們可以將整數或列表傳遞給 bin 參數。

當整數傳遞給 bin 時,該函數會將連續值離散化為大小相等的 bin,例如:

>>> df['Fare'].value_counts(bins=3)
(-0.513, 170.776]     871
(170.776, 341.553]     17
(341.553, 512.329]      3
Name: Fare, dtype: int64

當列表傳遞給 bin 時,該函數會將連續值劃分為自定義組,例如:

>>> df['Fare'].value_counts(bins=[-1, 20, 100, 550])
(-1.001, 20.0]    515
(20.0, 100.0]     323
(100.0, 550.0]     53
Name: Fare, dtype: int64

7、分組並執行 value_counts() Pandas groupby() 允許我們將數據分成不同的組來執行計算以進行更好的分析。一個常見的用例是按某個列分組,然後獲取另一列的唯一值的計數。例如,讓我們按「Embarked」列分組並獲取不同「Sex」值的計數。

>>> df.groupby('Embarked')['Sex'].value_counts()

Embarked  Sex   
C         male       95
          female     73
Q         male       41
          female     36
S         male      441
          female    203
Name: Sex, dtype: int64

8、將結果系列轉換為 DataFrame Pandas value_counts() 返回一個Series,包括前面帶有 MultiIndex 的示例。如果我們希望我們的結果顯示為 DataFrame,我們可以在 value_count() 之後調用 to_frame()。

>>> df.groupby('Embarked')['Sex'].value_counts().to_frame()

9、應用於DataFrame 到目前為止,我們一直將 value_counts() 應用於 Pandas Series,在 Pandas DataFrame 中有一個等效的方法。Pandas DataFrame.value_counts() 返回一個包含 DataFrame 中唯一行計數的系列。

讓我們看一個例子來更好地理解它:

df = pd.DataFrame({
    'num_legs': [2, 4, 4, 6],
    'num_wings': [2, 0, 0, 0]},
    index=['falcon', 'dog', 'cat', 'ant']
)
>>> df.value_counts()

num_legs  num_wings
4         0            2
6         0            1
2         2            1
dtype: int64

通過在 df 上調用 value_counts(),它返回一個以 num_legs 和 num_wings 作為索引的 MultiIndex 系列。從結果中,我們可以發現有 2 條記錄的 num_legs=4 和 num_wing=0。

同樣,我們可以調用 to_frame() 將結果轉換為 DataFrame

>>> df.value_counts().to_frame()