Как создать персонализированный столбец корзины из команды Pandas cut () с автоматически сгенерированными категориями и корзинами? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть Pandas DataFrame с несколькими столбцами.Одним из них является year.Из этого столбца я хочу создать новый с категориальными значениями (я думаю, что термины - это сегменты), с автоматически генерируемыми сегментами.Это должно привести к чему-то подобному:

year_gr         year    other_cols
A (1909 - 1917) 1911    abc
B (1921 - 1930) 1923    def
C (1932 - 1941) 1935    ghi

Мне удается создать что-то близкое к этому:

year_gr = pd.cut(df.year, 10, labels=[
   'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'])
df['year_gr'] = year_gr

df.head()

year_gr year    other_cols
A       1911    abc
B       1923    def
C       1935    ghi

Но как мне объединить ярости, автоматически генерируемые pd.cut, чтобымоя year_gr переменная?Я видел, что мы можем добавить параметр retbins=True в команду cut для извлечения корзин, но мне не удалось его использовать ...

Спасибо!

1 Ответ

0 голосов
/ 21 сентября 2019

pd.cut приводит к объекту категории, заполненному объектами интервала.Мы используем их атрибуты .left и .right для создания указанных строк.

    import numpy as np, pandas as pd
    import string

    # test data:
    df=pd.DataFrame({"year":[1911,1923,1935,1911],"other_cols":["abc","def","ghi","jkl"]})
  Out:
           year other_cols
    0  1911        abc
    1  1923        def
    2  1935        ghi
    3  1911        jkl

    #create the intervals:
    cats=pd.cut(df.year,10)

    Out: cats.dtypes.categories
    IntervalIndex([(1910.976, 1913.4], (1913.4, 1915.8], (1915.8, 1918.2],...

    # char generator:
    gchar=(ch for ch in string.ascii_uppercase)
    dlbls= { iv:next(gchar) for iv in cats.dtypes.categories } #EDIT1
    # get the intervals and convert them to the specified strings:
    df["year_gr"]=[ f"{dlbls[iv]} ({int(np.round(iv.left))} - {int(np.round(iv.right))})" for iv in cats ] #EDIT1
   Out:
          year other_cols          year_gr
    0  1911        abc  A (1911 - 1913)
    1  1923        def  B (1921 - 1923)
    2  1935        ghi  C (1933 - 1935)
    3  1911        jkl  A (1911 - 1913)

    # align the columns:
    df= df.reindex(["year_gr","year","other_cols"], axis=1)
   Out:
               year_gr  year other_cols
    0  A (1911 - 1913)  1911        abc
    1  B (1921 - 1923)  1923        def
    2  C (1933 - 1935)  1935        ghi
    3  A (1911 - 1913)  1911        jkl
...