如何通过pandas中的等价划分将连续值转换为离散值
How to convert continuous values into discrete values by equivalent partitioning in pandas
我想通过等效分区将数据框列的连续值转换为离散值。
比如下面是我的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
,[=]区间内的所有值=26=]为1
,[3.1, 4.1]
区间内的所有值为2
.
这是我的预期结果。
Expected:
a
0 0
1 0
2 0
3 1
4 1
5 2
您可以使用 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)]
您还可以使用 np.digitize
函数并定义 bin 的变化来分配标签
np.digitize(df.a,np.arange(1.1,4.1,1)) - 1
输出:
array([0, 0, 0, 1, 1, 2], dtype=int64)
让我们做 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
我想通过等效分区将数据框列的连续值转换为离散值。
比如下面是我的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
,[=]区间内的所有值=26=]为1
,[3.1, 4.1]
区间内的所有值为2
.
这是我的预期结果。
Expected:
a
0 0
1 0
2 0
3 1
4 1
5 2
您可以使用 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)]
您还可以使用 np.digitize
函数并定义 bin 的变化来分配标签
np.digitize(df.a,np.arange(1.1,4.1,1)) - 1
输出:
array([0, 0, 0, 1, 1, 2], dtype=int64)
让我们做 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