本文作者:石沛尧,中南财经政法大学金融学院
本文编辑:兰博文
技术总编:金 点
Stata and Python 数据分析
爬虫俱乐部Stata基础课程、Stata进阶课程和Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
数据交叉表(也称为列联表或交叉表)是一种统计方法,用于分析和展示两个或多个分类变量之间的关系。在 Python 中,我们可以使用 Pandas 库中的crosstab函数来创建两个或多个因子的交叉表,相比Excel,Python可以更多更快的处理数据,首先,引入几个重要的包:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
使用武汉市某超市过去一个月的销售数据(如有需要可联系作者获取),创建一个DataFrame对象,作为数据源,并通过可视化各商品的销售情况,找出最热卖的十样商品,代码如下:
data = pd.read_excel('3.1-3.31商品销售流水.xls')
# 计算每个商品的出现次数
product_counts = data['品名'].value_counts()
# 转换成DataFrame形式
product_counts = pd.DataFrame({'商品名称': product_counts.index, '出现次数': product_counts.values})
# 去掉袋子
product_counts = product_counts.drop([0, 3])
# 可视化销售情况
top_10 = product_counts.head(10)
ax = top_10.plot(kind='bar', x='商品名称', y='出现次数', figsize=(10, 6), color='skyblue')
plt.title('Top 10 Most Frequent Products in March')
plt.xlabel('Product')
plt.ylabel('Frequency')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
# 在柱子上方显示数值
for p in ax.patches:
ax.annotate(str(p.get_height()), (p.get_x() + p.get_width() / 2., p.get_height()), ha='center', va='center', xytext=(0, 5), textcoords='offset points')
plt.show()
结果如下:

首先,介绍一下crosstab 函数:
函数:
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc='default', margins=False, margins_name='All', dropna=True)
看一下参数主要的作用:
index:必选参数,行索引,这是创建交叉表时必须指定的参数,用于定义交叉表的行索引。可以设置为DataFrame中的一个或多个列,以创建多层索引。
columns:必选参数,列索引,这是创建交叉表时必须指定的参数,用于定义交叉表的列索引。通常用于展示分类数据。
values:非必选参数,被计算的数据项,这是一个可选参数,指定需要在交叉表中进行聚合操作的列。如果没有提供,交叉表将只计算行和列的组合数量。
rownames:非必选参数,行索引的名称,这是一个可选参数,用于指定行索引的名称。如果未指定,将使用 index参数中的名称。
colnames:非必选参数,列索引的名称,这是一个可选参数,用于指定列索引的名称。如果未指定,将使用 columns参数中的名称。
aggfunc:非必选参数,聚合函数,这是用于对交叉表中的数据进行聚合计算的函数,默认为 'default',表示使用 numpy 的 sum函数。可以根据需要选择其他聚合函数。
fill_values:非必选参数,填充NA值,这是一个可选参数,用于指定在交叉表中缺失值的填充值。如果未指定,缺失值将保留为 NaN。
margins:非必选参数,添加行列的总计,这是一个布尔值参数,默认为 False,表示不显示行列的总计。如果设置为 True,则会在交叉表的行和列末尾添加总计。
margins_name:非必选参数,边缘名称,当 margins=True时,此参数用于设置边缘行或列的名称,默认值为 'All'。
dropna:非必选参数,是否丢弃NA值,这是一个布尔值参数,默认为 True,表示如果整行或整列都是NA值,则这些行或列将被丢弃。如果设置为 False,则这些行或列将被保留。
根据上述函数参数介绍,通过下面一个例子进行示例,假设我们有一个包含性别(Gender)、就业状态(Employment Status)和年龄组(Age Group)的数据集,我们想要创建一个交叉表来分析不同性别和就业状态的分布情况,并计算每个组合的人数。代码如下:
import pandas as pd
# 示例数据
data2 = pd.DataFrame({
'Gender': ['Male', 'Female', 'Female', 'Male', 'Female', 'Male'],
'Employment Status': ['Employed', 'Unemployed', 'Employed', 'Employed', 'Unemployed', 'Employed'],
'Age Group': ['20-30', '20-30', '30-40', '30-40', '20-30', '40-50']
})
# 创建交叉表
cross_table = pd.crosstab(
index=data2['Gender'],
columns=data2['Employment Status'],
margins=True,
margins_name='Total'
)
print(cross_table)
结果如下:

根据前文crosstab 函数用法介绍,对本文使用的销售数据创建交叉表,使用热力图可视化交叉表,对“让利类型”和“top_10”创建数据交叉,代码如下:
# 使用 crosstab 创建交叉表
cross_tab = pd.crosstab(data['让利类型'],['top_10'] )
cross_tab
# 使用热力图可视化交叉表
sns.heatmap(cross_tab, annot=True, fmt="d")
plt.show()
结果如下:

同理,对“原价”和“top_10”创建数据交叉,代码如下:
# 使用 crosstab 创建交叉表
cross_tab = pd.crosstab(data['原价'],['top_10'] )
cross_tab
# 使用热力图可视化交叉表
sns.heatmap(cross_tab, annot=True, fmt="d")
plt.show()
结果如下:

同理,对“类别名称”和“top_10”创建数据交叉,代码如下:
# 使用 crosstab 创建交叉表
cross_tab = pd.crosstab(data['类别名称'], ['top_10'])
cross_tab
# 使用热力图可视化交叉表
sns.heatmap(cross_tab, annot=True, fmt="d")
plt.show()
结果如下:

同理,对“品名”和“top_10”创建数据交叉,代码如下:
# 使用 crosstab 创建交叉表
cross_tab = pd.crosstab(data['品名'],['top_10'] )
cross_tab
# 使用热力图可视化交叉表
sns.heatmap(cross_tab, annot=True, fmt="d")
plt.show()
结果如下:

以上就是用Python构造数据交叉表的内容介绍。数据交叉表是数据分析中非常重要的工具,掌握它可以让你更加高效地进行数据处理和可视化呈现。如果你对Python数据分析还有其他问题或者想要了解更多内容,欢迎留言讨论!
重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负
您的支持!
往期推文推荐
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。