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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。