希望将连续变量转换为分类变量

时间:2017-11-07 22:49:22

标签: python pandas

示例数据:

id      val1   val2   val3  val4  val5  val6  val7
///+8yr NaN    0.0    2.0     NaN   1     3   23    
///1vjh NaN    NaN    NaN     NaN   NaN   7   62
///4wu  3      NaN    6       NaN   7     8   180

基本上,我希望能够在这些行中获取超过5的每个值,并用一些分类变量替换它们(即" greaterthan5")。对于val7,我想基于30的间隔对它们进行分组,例如,0-30组合在一起,31-60将组合在一起。

我可以做一个for循环,但我不知道是否有更有效的方法。

1 个答案:

答案 0 :(得分:0)

IIUC你有两个问题。使用布尔索引可以实现使用'larger than 5'替换大于5的值的第一个问题,并且可以使用pd.cut()实现第二个分组问题

<强>样本:

d = pd.read_clipboard()

第1部分

获取不满足大于5个标准的值,

rest = d.loc[:,'val1':'val6'][~(d.loc[:,'val1':'val6'] >5)]
rest


   val1  val2  val3  val4  val5  val6
0   NaN   0.0   2.0   NaN   1.0   3.0
1   NaN   NaN   NaN   NaN   NaN   NaN
2   3.0   NaN   NaN   NaN   NaN   NaN

获得大于5的值

larger_than_5=d.loc[:,'val1':'val6'][d.loc[:,'val1':'val6'] >5]
print(larger_than_5)

   val1  val2  val3  val4  val5  val6
0   NaN   NaN   NaN   NaN   NaN   NaN
1   NaN   NaN   NaN   NaN   NaN   7.0
2   NaN   NaN   6.0   NaN   7.0   8.0

使用您的逻辑进行更新

larger_than_5[larger_than_5.notnull()] ='Larger than 5'
print(larger_than_5)

   val1  val2           val3  val4           val5           val6
0   NaN   NaN            NaN   NaN            NaN            NaN
1   NaN   NaN            NaN   NaN            NaN  Larger than 5
2   NaN   NaN  Larger than 5   NaN  Larger than 5  Larger than 5

使用逻辑

更新rest
rest.update(larger_than_5)
print(rest)

   val1  val2           val3  val4           val5           val6
0   NaN   0.0              2   NaN              1              3
1   NaN   NaN            NaN   NaN            NaN  Larger than 5
2   3.0   NaN  Larger than 5   NaN  Larger than 5  Larger than 5

根据逻辑1更新原始df的值和更新值

d.loc[:,'val1':'val6'] = rest
print(d)

        id  val1  val2           val3  val4           val5           val6  \
0  ///+8yr   NaN   0.0              2   NaN              1              3   
1  ///1vjh   NaN   NaN            NaN   NaN            NaN  Larger than 5   
2   ///4wu   3.0   NaN  Larger than 5   NaN  Larger than 5  Larger than 5   

   val7  
0    23  
1    62  
2   180  

第2部分

获取垃圾箱

bins = np.arange(0, d['val7'].max()+1, 30)
bins

array([  0,  30,  60,  90, 120, 150, 180], dtype=int64)

制作新系列

val7_groups = pd.cut(d['val7'], bins)
val7_groups

0       (0, 30]
1      (60, 90]
2    (150, 180]

将其添加到数据框

d['val7_groups'] = val7_groups
print(d)

        id  val1  val2           val3  val4           val5           val6  \
0  ///+8yr   NaN   0.0              2   NaN              1              3   
1  ///1vjh   NaN   NaN            NaN   NaN            NaN  Larger than 5   
2   ///4wu   3.0   NaN  Larger than 5   NaN  Larger than 5  Larger than 5   

   val7 val7_groups  
0    23     (0, 30]  
1    62    (60, 90]  
2   180  (150, 180] 

您还可以通过将值传递到pd.cut()

中的labels参数来设置组标签