создание числовых категорий данных панд - PullRequest
0 голосов
/ 09 ноября 2018

Я попытался взглянуть на какую-то ссылку, где я могу сделать дополнительный столбец, который будет категоричным на основе другого столбца.Я уже попробовал документацию pandas категорически , и переполнение стека, кажется, не имеет этого, но я думаю, что это должно быть, но, возможно, я использую неправильные поисковые теги?

например

Size    Size_cat
10      0-50
50      0-50
150     50-500
450     50-500
5000    1000-9000
10000   >9000
notice that the size category 500-1000 is missing (but no number corresponds to that)

Проблема заключается в том, что я создаю кросс-таблицу панд позже, как это:

summary_table = pd.crosstab(index[res_sum["Type"],res_sum["Size"]],columns=[res_sum["Found"]],margins=True)
summary_table = summary_table.div(summary_table["All"] / 100, axis=0)

После некоторого редактирования этой таблицы я получаю такой результат:

Found                 Exact        Near          No
Type        Size                                   
DEL         50        80         20            0
            100       60         40            0
            500       80         20            0
            1000      60         40            0
            5000      40         60            0
            10000     20         80            0
DEL_Total             56.666667   43.333333    0
DUP         50         0           0         100
            100        0           0         100
            500        0         100           0
            1000       0         100           0
            5000       0         100           0
            10000     20          80           0
DUP_Total              3.333333   63.333333   33.333333

проблема в том, что теперь (Размер) просто помещает размеры здесь, и поэтому эта таблица может варьироваться по размеру.Если в данных отсутствует 5000-DEL, этот столбец также исчезнет, ​​а затем DUP будет иметь 6 категорий и DEL 5. Кроме того, если я добавлю больше размеров, эта таблица станет очень большой.Поэтому я хотел создать категории размеров, но всегда сохранял одни и те же категории, даже если некоторые из них были бы пустыми.

Надеюсь, я ясен, потому что это довольно сложно объяснить.вот что я уже пробовал:

highest_size = res['Size'].max()
categories = int(math.ceil(highest_size / 100.0) * 100.0)
categories = int(categories / 10)

labels = ["{0} - {1}".format(i, i + categories) for i in range(0, highest_size, categories)]
print(highest_size)
print(categories)
print(labels)
10000
1000
['0 - 1000', '1000 - 2000', '2000 - 3000', '3000 - 4000', '4000 - 5000', '5000 - 6000', '6000 - 7000', '7000 - 8000', '8000 - 9000', '9000 - 10000']

Я получаю числовые категории, но, конечно, теперь они зависят от наибольшего числа, и категории меняются в зависимости от данных.Кроме того, мне все еще нужно связать их с колонкой «Размер» в пандах.Это не работает.

df['group'] = pd.cut(df.value, range(0, highest_size), right=False, labels=labels)

Если возможно, я бы хотел создать свои собственные категории, вместо того, чтобы использовать диапазон для выполнения тех же шагов, как я делал в первом примере выше.(в противном случае потребуется 100% с шагом 100, а при выполнении шага 1000 будет потеряно много данных в небольших регионах)

1 Ответ

0 голосов
/ 09 ноября 2018

См. Макет ниже, чтобы помочь вам понять логику. По сути, вы объединяете счет в пользовательские группы, используя cut (или даже lambda или map) и передавая значение в функцию GroupMapping. Дайте мне знать, если это работает.

import pandas as pd
df=pd.DataFrame({
        'Name':['Harry','Sally','Mary','John','Francis','Devon','James','Holly','Molly','Nancy','Ben'], 
        'Score': [1143,2040,2500,3300,3143,2330,2670,2140,2890,3493,1723]}
    )

def GroupMapping(dl):
    if int(dl) <= 1000: return '0-1000'
    elif 1000 < dl <= 2000: return '1000 - 2000'
    elif 2000 < dl <= 3000: return '2000 - 3000'
    elif 3000 < dl <= 4000: return '3000 - 4000'
    else: return 'None'

#df["Group"] = df['Score'].map(GroupMapping)
#df["Group"] = df['Score'].apply(lambda row: GroupMapping(row))
df['Group'] = pd.cut(df['Score'], [0, 1000, 2000, 3000, 4000], labels=['0-1000', '1000 - 2000', '2000 - 3000','3000 - 4000' ])
df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...