前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >盘一盘 Python 特别篇 16 - Cross Table

盘一盘 Python 特别篇 16 - Cross Table

作者头像
用户5753894
发布2020-06-24 11:36:21
1.1K0
发布2020-06-24 11:36:21
举报
文章被收录于专栏:王的机器王的机器王的机器

本文含 2573 字,16 图表截屏

建议阅读 14 分钟

交叉表 (cross table) 是透视表的特例,其默认的整合函数是计算个数频率

初探数据

我们拿一个贷款数据举例,首先载入数据,打印出首三行尾两行。

loan = pd.read_csv('Loan Data.csv')
loan.head(3).append(loan.tail(2))

info()函数查阅数据信息,有 32,581 条数据,11 条特征和 1 个标签 (loan_status 那列,0 代表未违约,1 代表违约。)

loan.info()

在机器学习中,我们通常用其他 11 个特征 (或特征转换) 建立模型来预测贷款的良莠。在选择特征前,用交叉表可以做单变量分析,即看看每个特征下的不同特征值对应的“违约”和“不违约”的贷款个数或比例。

按贷款种类统计个数

用交叉表来统计 person_home_ownership 列每个类别 (MORTGAGE, OTHER, OWN, RENT) 下面贷款状态的个数,0 代表未违约,1 代表违约。

pd.crosstab( index=loan['person_home_ownership'], 
             columns=loan['loan_status'] )

从上表可以一下看出 RENT 下面的违约贷款比例很高。

pivot_table() 函数可以等价实现上面用 crosstab() 的产出结果。由于是统计个数,那么整合函数用的是 len

pd.pivot_table( loan, index='person_home_ownership',
                      columns='loan_status',
                      aggfunc={'loan_status':len},
                      fill_value=0 )

按贷款评级统计个数

用交叉表来统计 loan_grade 列每个类别 (从 A 到 G) 下面贷款状态的个数,显示总数 (设置 margins=True) 并起名为 Total (设置 margins_name='Total')。

pd.crosstab( index=loan['loan_grade'], 
             columns=loan['loan_status'], 
             margins=True, 
             margins_name='Total' )

评级越高,违约贷款比例越低,这不正是评级的含义么。

按贷款种类计算利率均值

除了统计个数,交叉表也能做透视表做的事情。下列是在不同的 person_home_ownership 和 loan_status 下计算贷款利率的均值。

pd.crosstab( index=loan['person_home_ownership'], 
             columns=loan['loan_status'],
             values=loan['loan_int_rate'], 
             aggfunc='mean').round(2)

可以看出,违约贷款的利率都比没有违约贷款的利率高。

没有 fill_value 参数

crosstab() 函数中没有 fill_value 参数,如果结果有 NaN 值,只能紧接一个 .fillna() 函数。

pd.crosstab( index=loan['person_home_ownership'], 
             columns=loan['loan_grade'],
             values=loan['loan_int_rate'], 
             aggfunc='mean')

在 OTHER 类下没有评级为 G 的贷款,因此显示 NaN。由于 crosstab() 函数返回对象就是一个数据帧 (DataFrame),那么可以用其下的 fillna() 方法将 NaN 用其他值代替,比如下例用 0 值代替 NaN。

pd.crosstab( index=loan['person_home_ownership'], 
             columns=loan['loan_grade'],
             values=loan['loan_int_rate'], 
             aggfunc='mean').fillna(0)

按贷款目的统计百分比

上面已经展示交叉表的计数功能,如果最终结果想用频率展示的话,可以设置 normalize 参数,其中

  • normalized = True 或者 all,在所有元素上做标准化
  • normalized = columns,在列上做标准化
  • normalized = index,在行上做标准化

下面在不同的 loan_intent 和 loan_status 下统计贷款状态的百分比。

设置 normalize=True 按元素计算百分比,即所有元素下的百分比加起来等于 100%。

pd.crosstab( index=loan['loan_intent'], 
             columns=loan['loan_status'],
             normalize=True ).style.format("{:.2%}")

设置 normalize=columns 按列计算百分比,即在每列的百分比加起来等于 100%。

pd.crosstab( index=loan['loan_intent'], 
             columns=loan['loan_status'],
             normalize='columns' ).style.format("{:.2%}")

设置 normalize=index 按行计算百分比,即在每行的百分比加起来等于 100%。

pd.crosstab( index=loan['loan_intent'], 
             columns=loan['loan_status'],
             normalize='index' ).style.format("{:.2%}")

总结,一图胜千言!下图可视化 crosstab() 函数的用法。

Stay Tuned!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 王的机器 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
灰盒安全测试
腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档