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


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

Pandas crosstab(~) 方法計算多個列變量的交叉表。默認情況下,計算的統計數據是計數。請參閱示例以進行說明。

參數

1. index | array-like

用作結果 DataFrame 索引的值。

2. columns | array-like

生成的 DataFrame 的列。

3. values | array-like | optional

用於計算 agg_func 指定的統計數據的值。

4. rownames | sequence | optional

分配給生成的 DataFrame 中的行的名稱。默認情況下,rownames=None

5. colnames | sequence | optional

分配給生成的 DataFrame 中的列的名稱。默認情況下,colnames=None

6. aggfunc | function | optional

定義要計算的統計數據的函數。該函數的輸入是 values ,返回值必須是聚合統計量(例如平均值、最大值等)。

7. margins | boolean | optional

是否包含額外的行和列來指示單元格按行和按列的總和。默認情況下,margins=False

8. margin_names | string | optional

如果 margins 設置為 True ,則 margin_names 是新添加的行和列的名稱。

9. dropna | boolean | optional

是否刪除僅包含 NaN 的列。默認情況下,dropna=False

10.normalize | booleanstring | optional

是否通過除以計算值的總和來標準化計算值:

說明

"all"True

對所有值進行標準化。

"index"

按行標準化。

"columns"

按列標準化

False

不要正常化。

默認情況下,noramlize=False

返回值

DataFrame 表示多個因子的交叉列表。

例子

考慮以下 DataFrame :

df = pd.DataFrame({"name":["alex","bob","cathy","doge"], "gender":["male","male","female","male"], "age":[50,20,40,20]})
df



   name   gender  age
0  alex   male    50
1  bob    male    20
2  cathy  female  40
3  doge   male    20

基本用法

獲取不同年齡的男性和女性的數量:

pd.crosstab(index=df["age"], columns=df["gender"])



    gender  female   male
age		
20            0       2
40            1       0
50            0       1

在此,請注意以下事項:

  • 我們看到每個配置文件的計數細目。例如,我們有 2 名 20 歲的男性。

  • 標簽 gender 是分配給列的名稱。

指定行名和列名

為結果行和列指定特定名稱:

pd.crosstab(index=df["age"], columns=df["gender"], rownames=["AGE"], colnames=["GENDER"])



GENDER  female  male
AGE		
20        0      2
40        1      0
50        0      1

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

df



   name   gender  age
0  alex   male    50
1  bob    male    20
2  cathy  female  40
3  doge   male    20

指定 aggfunc

除了計數之外,我們還可以計算其他統計數據。例如,計算每個性別的平均年齡:

pd.crosstab(index=df["gender"], columns=["AGE"], values=df["age"], aggfunc=np.mean)



col_0   AGE
gender	
female  40
male    30

注意以下事項:

  • 我們正在使用 Numpy 的 mean(~) 函數。

  • 如果指定 aggfunc ,則還必須指定 values ,反之亦然。

指定邊距和margins_name

我們可以通過指定 margins=True 來計算按行和按列的統計信息總和:

pd.crosstab(index=df["age"], columns=df["gender"], margins=True)



gender  female  male  All
age      
20       0      2     2
40       1      0     1
50       0      1     1
All      1      3     4

您還可以通過設置 margins_name 重命名新引入的列和行:

pd.crosstab(index=df["age"], columns=df["gender"], margins=True, margins_name="TOTAL")



gender  female  male  TOTAL
age			
20        0      2      2
40        1      0      1
50        0      1      1
TOTAL     1      3      4

指定 dropna

考慮以下帶有缺失值的DataFrame:

df = pd.DataFrame({"name":["alex","bob","cathy","doge"], "gender":["male","male","female","male"], "age":[30,20,np.NaN,30]})
df



   name   gender  age
0  alex   male    30.0
1  bob    male    20.0
2  cathy  female  NaN
3  doge   male    30.0

使用 agegender 計算交叉表:

pd.crosstab(index=df["age"], columns=df["gender"])



gender  male
age	
20.0     1
30.0     2

請注意 female 的列(其值應使用 NaN 填充)並不存在。這是 dropna=True 的默認行為。

我們可以通過設置 dropna=False 來選擇保留該列,如下所示:

pd.crosstab(index=df["age"], columns=df["gender"], dropna=False)



gender  female  male
age		
20.0      0      1
30.0      0      2

請注意如何使用 0 填充 NaN

指定標準化

考慮以下 DataFrame :

df = pd.DataFrame({"name":["alex","bob","cathy","doge"], "gender":["male","male","female","male"], "age":[50,20,40,20]})
df



   name   gender  age
0  alex   male    50
1  bob    male    20
2  cathy  female  40
3  doge   male    20

默認情況下, normalize=False ,這意味著結果值未標準化:

pd.crosstab(index=df["age"], columns=df["gender"])



gender  female  male
age		
20        0      2
40        1      0
50        0      1

在這種情況下,歸一化是將每個值除以值的總和。

正確或"all"

要使用所有值進行標準化,隻需設置normalize=True,如下所示:

pd.crosstab(index=df["age"], columns=df["gender"], normalize=True)   # or normalize="all"



gender  female  male
age		
20      0.00    0.50
40      0.25    0.00
50      0.00    0.25

在這裏,我們得到 0.50 ,因為 2/(2+1+1)=0.5

"rows"

要按行標準化,請像這樣設置normalize="index"

pd.crosstab(index=df["age"], columns=df["gender"], normalize="index")



gender  female  male
age		
20       0.0    1.0
40       1.0    0.0
50       0.0    1.0
"columns"

要按列標準化,請像這樣設置normalize="columns"

pd.crosstab(index=df["age"], columns=df["gender"], normalize="columns")



gender  female  male
age		
20       0.0    0.666667
40       1.0    0.000000
50       0.0    0.333333

相關用法


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