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
| boolean
或 string
| optional
是否通過除以計算值的總和來標準化計算值:
值 |
說明 |
---|---|
|
對所有值進行標準化。 |
|
按行標準化。 |
|
按列標準化 |
|
不要正常化。 |
默認情況下,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
使用 age
和 gender
計算交叉表:
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
相關用法
- Python NumPy cross方法用法及代碼示例
- Python cudf.core.column.string.StringMethods.is_vowel用法及代碼示例
- Python NumPy char find方法用法及代碼示例
- Python cudf.Series.ceil用法及代碼示例
- Python cudf.core.column.string.StringMethods.endswith用法及代碼示例
- Python cuxfilter.charts.datashader.heatmap用法及代碼示例
- Python cusignal.windows.windows.hann用法及代碼示例
- Python cudf.DataFrame.isin用法及代碼示例
- Python cudf.core.column.string.StringMethods.title用法及代碼示例
- Python codecs.decode()用法及代碼示例
- Python cuml.metrics.pairwise_distances.pairwise_distances用法及代碼示例
- Python collections.somenamedtuple._replace用法及代碼示例
- Python cuxfilter.charts.panel_widgets.int_slider用法及代碼示例
- Python cudf.DataFrame.rmul用法及代碼示例
- Python cudf.Series.max用法及代碼示例
- Python cmp()用法及代碼示例
- Python cudf.DatetimeIndex.dayofweek用法及代碼示例
- Python cudf.DataFrame.apply用法及代碼示例
- Python cucim.skimage.feature.shape_index用法及代碼示例
- Python cuml.neighbors.KNeighborsClassifier用法及代碼示例
- Python cudf.core.column.string.StringMethods.contains用法及代碼示例
- Python cuxfilter.charts.datashader.line用法及代碼示例
- Python cudf.core.column.string.StringMethods.rsplit用法及代碼示例
- Python cudf.DataFrame.exp用法及代碼示例
- Python cudf.Series.head用法及代碼示例
注:本文由純淨天空篩選整理自Isshin Inada大神的英文原創作品 Pandas | crosstab method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。