Как классифицировать диапазон значений в Pandas DataFrame - PullRequest
4 голосов
/ 14 апреля 2019

Предположим, у меня есть следующий DataFrame:

   Area
0  14.68
1  40.54
2  10.82
3  2.31
4  22.3

И я хочу классифицировать эти значения в диапазоне.Как A: [1,10], B: [11,20], C ...

   Area
0  B
1  D
2  C
3  A
4  C

Как я могу сделать это с Пандами?Я попробовал следующий код:

bins = pd.IntervalIndex.from_tuples([(0, 11), (11, 20), (20, 50), (50, 100), (100, 500), (500, np.max(df["area"]) + 1)], closed='left')
catDf = pd.cut(df["area"], bins = bins)

Но команда "cut" просто поместила значения диапазона в DataFrame, и я хочу поставить имена категорий вместо диапазона.

EDIT :Я пытался передать ярлык на разрез, но ничего не изменилось. EDIT2 : Чтобы уточнить, если значение «area» имеет 10,21, значит, оно находится в диапазоне [10,20], поэтому оно должно быть помечено как «B» или другая метка для этого диапазона значений.

Ответы [ 3 ]

1 голос
/ 14 апреля 2019

У меня работает cat.codes с индексацией путем преобразования списка a в массив numpy:

a = list('ABCDEF')
df['new'] = np.array(a)[pd.cut(df["Area"], bins = bins).cat.codes]
print (df)
     Area new
0   14.68   B
1   40.54   C
2   10.82   A
3    2.31   A
4   22.30   C
5  600.00   F

catDf = pd.Series(np.array(a)[pd.cut(df["Area"], bins = bins).cat.codes], index=df.index)
print (catDf)
0    B
1    C
2    A
3    A
4    C
5    F
dtype: object
0 голосов
/ 14 апреля 2019

Вы можете указать метки следующим образом:

Примечание не уверен, какие диапазоны вы использовали:

pd.cut(df.Area, [1,10, 20, 50, 100], labels=['A', 'B', 'C', 'D'])

0    B
1    C
2    B
3    A
4    C
Name: Area, dtype: category
Categories (4, object): [A < B < C < D]
0 голосов
/ 14 апреля 2019

Предполагая, что bin является глобальной переменной, вы можете сделать это

   def number_to_bin(number):
        ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        for i, bin in enumerate(bins):
            if number >= bin[0] and number <= bin[1]:
                return ALPHABETS[i]

   df["area"] = df["area"].apply(number_to_bin)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...