如何基于矩阵型pandas DataFrame绘制配对数值分布直方图
行列交叉表数值分布直方图实现方案
你的这种类乘法表结构本质是行列索引交叉的二维数值表,要统计所有行列配对值的分箱计数,不需要复杂的配对遍历,直接展平二维数据即可绘图,实现步骤如下:
- 首先导入依赖并构造示例数据表
import pandas as pd import matplotlib.pyplot as plt group_a = {'ba':[2.0,9.4,10.8], 'bb':[4.2,7.1,3], 'bc':[8.1,9.5,6.1]} A = pd.DataFrame(group_a, index=['aa','ab','ac'])
- 提取所有行列交叉点的数值
两种方法都可以拿到全部9个行-列配对的一维数值序列:- 直接展平numpy数组:
all_vals = A.values.flatten() - 用pandas的stack方法转换:
all_vals = A.stack()
两种方式得到的结果完全一致,包含所有交叉点的值:[2.0, 4.2, 8.1, 9.4, 7.1, 9.5, 10.8, 3.0, 6.1]
- 直接展平numpy数组:
- 绘制直方图
直接调用直方图绘制接口即可,支持自定义分箱规则:
# 方式1:matplotlib绘图 plt.hist(all_vals, bins=5, edgecolor='black') plt.xlabel('数值分箱') plt.ylabel('落入分箱的行-列配对数量') plt.show() # 方式2:pandas内置绘图(更简洁,不需要单独展平数据) A.stack().hist(bins=[0,3,6,9,12], edgecolor='black') # 此处bins传入自定义区间边界 plt.xlabel('数值分箱') plt.ylabel('落入分箱的行-列配对数量') plt.show()
参数说明:如果要自定义分箱,给bins传入分箱边界的列表即可,比如bins=[0,3,6,9,12]就会按照03、36、69、912四个固定区间统计配对数量;如果传入整数则会自动按数值范围等距划分对应数量的分箱。
内容的提问来源于stack exchange,提问作者newbzzs
相关产品推荐
相关产品推荐

