Как преобразовать непрерывные значения в дискретные значения путем эквивалентного разделения в пандах - PullRequest
0 голосов
/ 28 октября 2018

Я хочу преобразовать непрерывные значения столбца данных в дискретные значения путем эквивалентного разбиения.Например, следующее мое 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

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Вы также можете использовать функцию np.digitize и определять вариацию ячеек для назначения меток

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

Из:

array([0, 0, 0, 1, 1, 2], dtype=int64)
0 голосов
/ 28 октября 2018

Давайте сделаем 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
0 голосов
/ 28 октября 2018

Вы можете использовать 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)]
...