pandas
交叉表
看过来
《pandas 教程》 持续更新中,可作为 pandas 入门进阶课程、pandas 中文手册、用法大全,配有案例讲解和速查手册。提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。查看更新日志。作者开办 Python 数据分析培训,详情 Python 数据分析培训。
![]() |
本教程作者所著新书《Python之光:Python编程入门与实战》(ISBN:9787111729891)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
![]() |
本教程作者所著新书《深入浅出Pandas:利用Python进行数据处理与分析》(ISBN:9787111685456)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
交叉表是用于统计分组频率的特殊透视表。简单来说,就是将两个或者多个列重中不重复的元素组成一个新的 DataFrame,新数据的行和列交叉的部分值为其组合在原数据中的数量。
语法结构如下:
pd.crosstab(index, columns, values=None, rownames=None,
colnames=None, aggfunc=None, margins=False,
margins_name: str = 'All', dropna: bool = True,
normalize=False) → 'DataFrame'
参数说明:
在下例中,A B 两列进行交叉,A 有不重复的值 1和2,B 有3和4。交叉后组成了新的数据,具体的值为对应行列上的组合在原数据中的数量。
df = pd.DataFrame({'A': [1, 2, 2, 2, 2],
'B': [3, 3, 4, 4, 4],
'C': [1, 1, np.nan, 1, 1]})
'''
A B C
0 1 3 1.0
1 2 3 1.0
2 2 4 NaN
3 2 4 1.0
4 2 4 1.0
'''
pd.crosstab(df['A'], df['B'])
'''
B 3 4
A
1 1 0
2 1 3
'''
可以对 Categorical
分类类型数据进行交叉:
foo = pd.Categorical(['a', 'b'], categories=['a', 'b', 'c'])
bar = pd.Categorical(['d', 'e'], categories=['d', 'e', 'f'])
pd.crosstab(foo, bar)
'''
col_0 d e
row_0
a 1 0
b 0 1
'''
对交叉结果进行归一化:
pd.crosstab(df['A'], df['B'], normalize=True)
'''
B 3 4
A
1 0.2 0.0
2 0.2 0.6
'''
对每列进行归一化:
pd.crosstab(df['A'], df['B'], normalize='columns')
'''
B 3 4
A
1 0.5 0.0
2 0.5 1.0
'''
指定列做为值,并将这些值按一定算法进行聚合:
pd.crosstab(df['A'], df['B'], values=df['C'], aggfunc=np.sum)
'''
B 3 4
A
1 1.0 NaN
2 1.0 2.0
'''
在最右边增加一个汇总列:
pd.crosstab(df['A'], df['B'],
values=df['C'],
aggfunc=np.sum,
normalize=True,
margins=True)
'''
B 3 4 All
A
1 0.25 0.0 0.25
2 0.25 0.5 0.75
All 0.50 0.5 1.00
'''