【问题标题】:Numpy cut without removing other columnNumpy 切割而不删除其他列
【发布时间】:2022-11-19 02:34:39
【问题描述】:

例如我有这个数据框:

   count
A   20
B   20
C   15
D   10
E   10
F    8
G    7
H    5
I    5

如果我想根据最大的 75%、15%、10% 创建一个组。我希望这样:

   count   Class
A   20     Top75
B   20     Top75 
C   15     Top75
D   10     Top75
E   10     Top75
F    8     Top15
G    7     Top15
H    5     Top10
I    5     Top10

已使用 np.cut 对目标 75、15、10 进行了回复。它分类正确,但删除了“计数”列。使用np.qcut 它划分不同。 所以,我想使用 np.cut 但不删除计数值

【问题讨论】:

  • 继续上一个问题,您能否分解您手动用于分配每个 bin 中的值的计算?还是算百分比?你能数出215吗?

标签: pandas dataframe numpy


【解决方案1】:

我仍然不清楚确切的逻辑,但假设计数总和为 100,则按降序排列。您可以使用累计和:

bins = [10, 15, 75]
df['Class'] = pd.cut(df.loc[::-1, 'count'].cumsum(),
                     np.cumsum([0]+bins),
                     labels=[f'Top{n}' for n in range(len(bins), 0, -1)])

输出:

   count Class
A     20  Top1
B     20  Top1
C     15  Top1
D     10  Top1
E     10  Top1
F      8  Top2
G      7  Top2
H      5  Top3
I      5  Top3

中间体:

   count  cumsum        bin Class
A     20     100  (25, 100]  Top1
B     20      80  (25, 100]  Top1
C     15      60  (25, 100]  Top1
D     10      45  (25, 100]  Top1
E     10      35  (25, 100]  Top1
F      8      25   (10, 25]  Top2
G      7      17   (10, 25]  Top2
H      5      10    (0, 10]  Top3
I      5       5    (0, 10]  Top3

【讨论】:

    【解决方案2】:
    df = pd.DataFrame(dict(count=[20,20,15,10,8,5]))
    df['class'] = pd.cut(df['count'], [0, 5, 15, 20], labels=['Top10', 'Top15', 'Top75'])
    
    |    |   count | class   |
    |---:|--------:|:--------|
    |  0 |      20 | Top75   |
    |  1 |      20 | Top75   |
    |  2 |      15 | Top15   |
    |  3 |      10 | Top15   |
    |  4 |       8 | Top15   |
    |  5 |       5 | Top10   |
    

    【讨论】:

      【解决方案3】:

      我不知道你到底想要什么,但我认为这可能是需要的

      min_c = df['count'].min()
      max_c = df['count'].max()
      bins = [min_c-0.001, 0.9 * min_c + 0.1 * max_c, 0.75 * min_c + 0.25 * max_c, max_c]
      labels = ['Top10', 'Top25', 'Top75']
      df.assign(Class=pd.cut(df['count'], bins=bins, labels=labels))
      

      输出:

          count   Class
      A   20      Top75
      B   20      Top75
      C   15      Top75
      D   10      Top75
      E   10      Top75
      F   8       Top25
      G   7       Top25
      H   5       Top10
      I   5       Top10
      

      【讨论】:

        猜你喜欢
        • 2014-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        • 2013-08-17
        • 2023-03-30
        相关资源
        最近更新 更多