如何通过熊猫中的等效分区将连续值转换为离散值

时间:2018-10-28 03:13:04

标签: python pandas dataframe divide

我想通过等效分配将数据帧列的连续值转换为离散值。 例如,以下是我的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,将{区间中的所有值{1}}为[2.1, 3.1),间隔1中的所有值都为[3.1, 4.1]

所以这是我的预期结果。

2

Expected:

3 个答案:

答案 0 :(得分:3)

您可以将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)]

答案 1 :(得分:1)

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

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

出局:

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

答案 2 :(得分:1)

让我们做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