Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过等价划分将连续值转换为离散值_Python_Pandas_Dataframe_Divide - Fatal编程技术网

Python 如何通过等价划分将连续值转换为离散值

Python 如何通过等价划分将连续值转换为离散值,python,pandas,dataframe,divide,Python,Pandas,Dataframe,Divide,我想通过等效分区将数据帧列的连续值转换为离散值。 例如,下面是我的输入 我想将列a中的连续值分成3个区间 输入: import pandas as pd import numpy as np df = pd.DataFrame({'a':[1.1, 1.2, 1.3, 2.4, 2.5, 4.1]}) a 0 1.1 1 1.2 2 1.3 3 2.4 4 2.5 5 4.1 输出: import pandas as pd import numpy as np

我想通过等效分区将数据帧列的连续值转换为离散值。 例如,下面是我的
输入

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

输入:

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'a':[1.1, 1.2, 1.3, 2.4, 2.5, 4.1]})
     a
0  1.1
1  1.2
2  1.3
3  2.4
4  2.5
5  4.1
输出:

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'a':[1.1, 1.2, 1.3, 2.4, 2.5, 4.1]})
     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个区间

如您所见,每个间隔的大小等于
(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

这是我的预期结果

应为:

   a
0  0
1  0
2  0
3  1
4  1
5  2
您可以将参数
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,bin=3,labels=np.arange(3),right=False)
0    0
1    0
2    0
3    1
4    1
5    2
名称:a,数据类型:类别
类别(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)]
pd.cut(df.a,bin=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)
名称:a,数据类型:类别
类别(3,区间[64]):[[1.1,2.1)<[2.1,3.1)<[3.1,4.103]

您还可以使用
np.数字化
功能并定义箱子的变化以分配标签

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


让我们做
diff
cumsum

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