与Pandas进行二维分箱


狗头军师
2025-03-22 06:26:41 (17天前)

因此,我希望将两组功能进行分类(分类),然后合并以创建新功能。它与将坐标分类为地图上的网格一样。

问题在于要素的分布不均匀,并且pandas.qcut()在对两个要素/坐标进行装仓(如时)时,我想使用分位数。

有没有比同时qcut()使用两个功能和然后将结果标签串联更好的方法了?

2 条回复
  1. 1# v-star*위위 | 2020-08-23 15-08

    创建一个笛卡尔积。

    考虑数据框 df

    1. df = pd.DataFrame(dict(A=np.random.rand(20), B=np.random.rand(20)))
    2. A B
    3. 0 0.538186 0.038985
    4. 1 0.185523 0.438329
    5. 2 0.652151 0.067359
    6. 3 0.746060 0.774688
    7. 4 0.373741 0.009526
    8. 5 0.603536 0.149733
    9. 6 0.775801 0.585309
    10. 7 0.091238 0.811828
    11. 8 0.504035 0.639003
    12. 9 0.671320 0.132974
    13. 10 0.619939 0.883372
    14. 11 0.301644 0.882258
    15. 12 0.956463 0.391942
    16. 13 0.702457 0.099619
    17. 14 0.367810 0.071612
    18. 15 0.454935 0.651631
    19. 16 0.882029 0.015642
    20. 17 0.880251 0.348386
    21. 18 0.496250 0.606346
    22. 19 0.805688 0.401578

    我们可以创建新的分类 pd.qcut

    1. d1 = df.assign(
    2. A_cut=pd.qcut(df.A, 2, labels=[1, 2]),
    3. B_cut=pd.qcut(df.B, 2, labels=list('ab'))
    4. )
    5. A B A_cut B_cut
    6. 0 0.538186 0.038985 1 a
    7. 1 0.185523 0.438329 1 b
    8. 2 0.652151 0.067359 2 a
    9. 3 0.746060 0.774688 2 b
    10. 4 0.373741 0.009526 1 a
    11. 5 0.603536 0.149733 1 a
    12. 6 0.775801 0.585309 2 b
    13. 7 0.091238 0.811828 1 b
    14. 8 0.504035 0.639003 1 b
    15. 9 0.671320 0.132974 2 a
    16. 10 0.619939 0.883372 2 b
    17. 11 0.301644 0.882258 1 b
    18. 12 0.956463 0.391942 2 a
    19. 13 0.702457 0.099619 2 a
    20. 14 0.367810 0.071612 1 a
    21. 15 0.454935 0.651631 1 b
    22. 16 0.882029 0.015642 2 a
    23. 17 0.880251 0.348386 2 a
    24. 18 0.496250 0.606346 1 b
    25. 19 0.805688 0.401578 2 b

    您可以使用元组创建笛卡尔乘积

    1. d2 = d1.assign(cartesian=pd.Categorical(d1.filter(regex='_cut').apply(tuple, 1)))
    2. print(d2)
    3. A B A_cut B_cut cartesian
    4. 0 0.538186 0.038985 1 a (1, a)
    5. 1 0.185523 0.438329 1 b (1, b)
    6. 2 0.652151 0.067359 2 a (2, a)
    7. 3 0.746060 0.774688 2 b (2, b)
    8. 4 0.373741 0.009526 1 a (1, a)
    9. 5 0.603536 0.149733 1 a (1, a)
    10. 6 0.775801 0.585309 2 b (2, b)
    11. 7 0.091238 0.811828 1 b (1, b)
    12. 8 0.504035 0.639003 1 b (1, b)
    13. 9 0.671320 0.132974 2 a (2, a)
    14. 10 0.619939 0.883372 2 b (2, b)
    15. 11 0.301644 0.882258 1 b (1, b)
    16. 12 0.956463 0.391942 2 a (2, a)
    17. 13 0.702457 0.099619 2 a (2, a)
    18. 14 0.367810 0.071612 1 a (1, a)
    19. 15 0.454935 0.651631 1 b (1, b)
    20. 16 0.882029 0.015642 2 a (2, a)
    21. 17 0.880251 0.348386 2 a (2, a)
    22. 18 0.496250 0.606346 1 b (1, b)
    23. 19 0.805688 0.401578 2 b (2, b)

    如果您愿意,甚至可以为他们声明订购。

登录 后才能参与评论