Сортировать столбец в кадре данных pandas после редкости значений в группах - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть pandas датафрейм очищенных веб-сайтов с идентификатором веб-сайта, текстом и меткой веб-сайтов.У небольшого числа веб-сайтов есть две метки, но, поскольку я хочу сначала обучить классификатору одной метки, я хотел бы создать версию данных с одной меткой для каждого веб-сайта (я знаю, что это немного проблематично).Метки в моем наборе данных несбалансированы (некоторые метки встречаются очень часто, а некоторые очень редко).Если я удаляю дубликаты идентификаторов веб-сайта, я хотел бы сначала удалить ярлыки, которые очень распространены.Вот так выглядит мой набор данных с несколькими метками:

ID   Label   Text
1    a       some text
1    b       other text
1    a       data
2    a       words
2    c       more words
3    a       text
3    b       short text

Моя идея состояла в том, чтобы отсортировать столбец меток в каждом идентификаторе веб-сайта по редкости метки.Для этого я сначала должен сделать value_counts(ascending = True) в столбце меток, чтобы получить список всех меток, отсортированных по редкости.

to_sort = [c, b, a]

Затем я хотел бы использовать этот список для сортировки каждого идентификатора веб-сайта по редкости.Я не уверен, как это сделать, хотя.Результат должен выглядеть следующим образом:

ID   Label   Text
1    b       other text
1    a       some text
1    a       data
2    c       more words
2    a       words
3    b       short text
3    a       text

Я бы тогда использовал df.drop_duplicates(subset = 'ID', keep = 'first'), чтобы сохранить самый редкий ярлык.Как я могу сделать сортировку?

Ответы [ 2 ]

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

Вы можете достичь своей цели, сделав столбец меток Категориальный , затем отсортировав по ID и Метка . Посмотрим на практике.

import pandas as pd
df = pd.DataFrame( {'ID': [1,1,1,2,2,3,3], "Label": ["a", "b", "a", "a", "c", "a", "b"],
                   'Text': ["some text", "other text","data", "words", "more words", "text", "short text"]} )
df
    ID  Label   Text
0   1   a   some text
1   1   b   other text
2   1   a   data
3   2   a   words
4   2   c   more words
5   3   a   text
6   3   b   short text

Определите порядок ваших этикеток, выполнив:

to_sort = df.Label.value_counts(ascending = True).index
to_sort
Index(['c', 'b', 'a'], dtype='object')

Затем создайте столбец Метка Категориальный следующим образом:

df.Label = pd.Categorical(df.Label,categories = to_sort, ordered = True)

Наконец, сортировка по ID и Метка :

df.sort_values(["ID", "Label"]).reset_index(drop = True)

    ID  Label   Text
0   1   b   other text
1   1   a   some text
2   1   a   data
3   2   c   more words
4   2   a   words
5   3   b   short text
6   3   a   text
0 голосов
/ 12 ноября 2018

Использование заказано categorical, поэтому возможно использование sort_values:

to_sort = list('cba')

df['Label'] = pd.Categorical(df['Label'], ordered=True, categories=to_sort)

df = df.sort_values(['ID','Label'])
print (df)
   ID Label        Text
1   1     b  other text
0   1     a   some text
2   1     a        data
4   2     c  more words
3   2     a       words
6   3     b  short text
5   3     a        text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...