【问题标题】:How to convert continuous values into discrete values by equivalent partitioning in pandas如何通过熊猫中的等效分区将连续值转换为离散值
【发布时间】:2018-10-28 03:13:04
【问题描述】:

我想通过等效分区将数据框列的连续值转换为离散值。 比如下面是我的input

我想将a列中的连续值分成3个区间。

Input:

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'a':[1.1, 1.2, 1.3, 2.4, 2.5, 4.1]})

Output:

     a
0  1.1
1  1.2
2  1.3
3  2.4
4  2.5
5  4.1

a列中,最小值为1.1,最大值为4.1,我想将其分为3 intervals

如您所见,每个区间的大小等于(4.1-1.1)/3 = 1.0。所以我可以将[1.1, 2.1)(大于等于1.1且小于2.1)区间内的所有值视为0,将[2.1, 3.1)区间内的所有值视为1,并且[3.1, 4.1]区间内的所有值都为2

所以这是我的预期结果。

Expected:

   a
0  0
1  0
2  0
3  1
4  1
5  2

【问题讨论】:

    标签: python pandas dataframe divide


    【解决方案1】:

    您可以将pd.cut 与参数right = False 一起使用:

    pd.cut(df.a, bins=3, labels=np.arange(3), right=False)
    
    0    0
    1    0
    2    0
    3    1
    4    1
    5    2
    Name: a, dtype: category
    Categories (3, int64): [0 < 1 < 2]
    

    分箱是如何完成的:

    pd.cut(df.a, bins=3, right=False)
    
    0      [1.1, 2.1)
    1      [1.1, 2.1)
    2      [1.1, 2.1)
    3      [2.1, 3.1)
    4      [2.1, 3.1)
    5    [3.1, 4.103)
    Name: a, dtype: category
    Categories (3, interval[float64]): [[1.1, 2.1) < [2.1, 3.1) < [3.1, 4.103)]
    

    【讨论】:

      【解决方案2】:

      您还可以使用np.digitize 函数并定义箱的变化来分配标签

      np.digitize(df.a,np.arange(1.1,4.1,1)) - 1
      

      输出:

      array([0, 0, 0, 1, 1, 2], dtype=int64)
      

      【讨论】:

        【解决方案3】:

        让我们做diffcumsum

        df.a=(~np.isclose(df.a.diff(),0.1)).cumsum()-1 # since it is float I am using close 
        df
        Out[395]: 
           a
        0  0
        1  0
        2  0
        3  1
        4  1
        5  2
        

        【讨论】:

          猜你喜欢
          • 2020-11-05
          • 1970-01-01
          • 2021-02-15
          • 1970-01-01
          • 2021-05-08
          • 2021-08-04
          • 1970-01-01
          • 1970-01-01
          • 2016-03-09
          相关资源
          最近更新 更多