当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


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