Я пытаюсь превратить столбец строк в целочисленные идентификаторы ... и я не могу найти элегантный способ сделать это в пандах (или python). В следующем примере я преобразовываю «A», который представляет собой столбец / переменную строк в числа через отображение, но для меня это выглядит как грязный хак

import pandas as pd                                                                             
import numpy as np

df = pd.DataFrame({'A': ['homer_simpson', 'mean_street', 'homer_simpson', 'bla_bla'], 'B': 4})

unique = df['A'].unique()
mapping = dict(zip(unique, np.arange(len(unique))))

new_df = df.replace({'A': mapping})

Есть ли лучший, более прямой способ достижения этого?

4
manu 17 Дек 2015 в 11:11

4 ответа

Лучший ответ

Как насчет использования factorize?

>>> labels, uniques = df.A.factorize()
>>> df.A = labels
>>> df
   A  B
0  0  4
1  1  4
2  0  4
3  2  4

http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.factorize.html

5
satomacoto 17 Дек 2015 в 08:49

Извините, но у меня недостаточно очков репутации, чтобы комментировать (здесь новичок). Просто хочу знать, будет ли использование Dataframe join быстрее, как это:

df.merge(df.drop_duplicates().reset_index(),on="A")["index"]
0
Aman 5 Май 2017 в 12:37

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

df['A'] = df.A.map({val: n for n, val in enumerate(df['A'].unique())})

>>> df
   A  B
0  0  4
1  1  4
2  0  4
3  2  4
1
Alexander 17 Дек 2015 в 08:32

Предполагая, что вас не очень заботит что такое целые числа, просто существует согласованное отображение, вы можете (1) использовать категориальные коды или (2) ранжировать значения:

>>> df["A_categ"] = pd.Categorical(df.A).codes
>>> df["A_rank"] = df["A"].rank("dense").astype(int)
>>> df
               A  B  A_categ  A_rank
0  homer_simpson  4        1       2
1    mean_street  4        2       3
2  homer_simpson  4        1       2
3        bla_bla  4        0       1
1
DSM 17 Дек 2015 в 08:21