Отобразить ряд строк Pandas, используя индексную позицию в другом массиве - PullRequest
0 голосов
/ 06 июля 2018

У меня есть серия панд вроде:

0    bar
1    foo
2    bar
3    bar
4    bar
5    foo

Я хотел бы отобразить эту серию на другую серию на основе массива с указанием порядка [bar, foo]. Тогда результат должен быть:

0    0
1    1
2    0
3    0
4    0
5    1

Как я могу это сделать?

Предыстория: у меня есть ученик склеарн, который внутренне отображает категориальную цель в массив learner.classes_ numpy с порядком исходных классов. Я пытаюсь реализовать некоторые дополнительные методы, и мне нужно сопоставить их входные данные (входные ряды выше), используя эти classes_, каждый класс со своим индексом, потому что это то, что затем используется внутри ученика.

Ответы [ 5 ]

0 голосов
/ 06 июля 2018

Внутренне все оценщики scikit используют LabelEncoder для кодирования меток класса строки в целые числа.LabelEncoder по умолчанию использует numpy.unique для получения всех уникальных классов, а numpy.unique возвращает их в алфавитном порядке.

Вы также можете использовать это (или расширить) для выполнения своих требований.

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(['bar', 'foo', 'bar', 'bar', 'bar', 'foo'])

le.classes_
#Output: array(['bar', 'foo'], dtype='|S3')

le.transform(['bar', 'foo', 'bar']) 
#Output: array([0, 1, 0])

le.inverse_transform([0, 1, 1])
#Output: array(['bar', 'foo', 'foo'], dtype='|S3')
0 голосов
/ 06 июля 2018

Поскольку деревья склеарна зависят от способа целочисленного кодирования категорий, вы можете захотеть пользовательским кодировать категории

df = pd.DataFrame({'the_column': ['bar', 'foo', 'bar', 'bar', 'bar', 'foo']})
cat_map = {'bar' :0 , 'foo' : 1}
df['category_map'] = df['the_column'].map(cat_map)
df.drop('the_column',axis = 1)
df.head()
0 голосов
/ 06 июля 2018

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

df=pd.Series(['aa','bb','aa'])
ref=np.array(['aa','bb'])
d=dict({str(r):i for (i,r) in enumerate(ref)})
df=df.replace(d)
0 голосов
/ 06 июля 2018

Вы можете использовать Категориальные данные , чтобы указать заказное упорядочение через список. Преобразование в коды возможно через pd.Series.cat.codes:

df = pd.DataFrame({'s': ['bar', 'foo', 'bar', 'bar', 'bar', 'foo']})

orderList = ['bar', 'foo']

df['s'] = pd.Categorical(df['s'], categories=orderList, ordered=True)
df['s'] = df['s'].cat.codes

print(df)

   s
0  0
1  1
2  0
3  0
4  0
5  1
0 голосов
/ 06 июля 2018

ОК, похоже, так оно и есть:

mapping_series = pandas.Series(range(len(classes)), index=classes)
output = input.map(mapping_series)

Итак, хитрость в том, что строки должны быть индексом ряда отображений. Я просто пытался output = input.map(pandas.Series(classes)), но это не работает.

...