根据两列和各自的范围值创建计数矩阵 pandas

Create count matrix based on two columns and respective range values pandas

我有一个如下所示的数据框,

name,value,id
meanerror,0.55,aa
meanamount,120,aa
meanerror,0.45,bb
meanamount,150,bb
meanerror,0.88,cc
meanamount,110,cc
meanerror,0.1,dd
meanamount,50,dd

我想从这个数据框创建一个矩阵,如下所示。

,         meanamount,    total_y
meanerror,0-100,100-200
0.0-0.5,    1,    1,      2   
0.5-1,      0,    2,      2
total_x,    1,    3

我真正需要的是,在矩阵中,每个单元格都应包含 id 的计数,这些 id 的值(来自值列)在矩阵的 x 轴和 y 轴的范围内。例如,第一个单元格应该包含 ids 的计数,meanamount 在 0-100 范围内,meanerror 在 0.0-5 范围内。

我尝试了 pandas 数据透视表 table 和交叉表,但不确定如何实现。有人可以帮忙吗?

  1. 创建 pivot table:

    pt = df.pivot(index='id', columns='name', values='value')
    
    # name  meanamount  meanerror
    # id                         
    # aa         120.0       0.55
    # bb         150.0       0.45
    # cc         110.0       0.88
    # dd          50.0       0.10
    
  2. Cut 分箱数量和误差:

    pt['meanamount'] = pd.cut(pt['meanamount'], bins=range(0, 300, 100))
    pt['meanerror'] = pd.cut(pt['meanerror'], bins=np.arange(0, 1.5, 0.5))
    
    # name  meanamount   meanerror
    # id                          
    # aa    (100, 200]  (0.5, 1.0]
    # bb    (100, 200]  (0.0, 0.5]
    # cc    (100, 200]  (0.5, 1.0]
    # dd      (0, 100]  (0.0, 0.5]
    
  3. 创建一个 crosstab 的错误 x 数量:

    pd.crosstab(pt['meanerror'], pt['meanamount'], margins=True)
    
    # meanamount  (0, 100]  (100, 200]  All
    # meanerror                            
    # (0.0, 0.5]         1           1    2
    # (0.5, 1.0]         0           2    2
    # All                1           3    4