看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
交叉表是用于统计分组频率的特殊透视表。简单来说,就是将两个或者多个列重中不重复的元素组成一个新的 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
'''
更新时间:2020-06-01 15:49:51 标签:pandas 交叉表