Коды категорий данных в пандах из двух столбцов

У меня есть датафрейм для панд, где две колонки соответствуют именам людей. Столбцы связаны, и одно и то же имя означает одного и того же человека. Я хочу назначить код категории так, чтобы он действовал для всего пространства имен.

Например, мой фрейм данных

df = pd.DataFrame({"P1":["a","b","c","a"], "P2":["b","c","d","c"]})

>>> df
  P1 P2
0  a  b
1  b  c
2  c  d
3  a  c

Я хочу, чтобы он был заменен соответствующими кодами категории, так что

>>> df
   P1  P2
0   1   2
1   2   3
2   3   4
3   1   3

Фактически категории получены из объединенного массива ["a", "b", "c", "d"] и применяются к отдельным столбцам отдельно. Как я могу достичь этого?

2 ответа

Решение

Использование:

print (df.stack().rank(method='dense').astype(int).unstack())
   P1  P2
0   1   2
1   2   3
2   3   4
3   1   3

РЕДАКТИРОВАТЬ:

Для более общего решения я использовал другой ответ, потому что проблема с дубликатами в индексе:

df = pd.DataFrame({"P1":["a","b","c","a"],
                   "P2":["b","c","d","c"],
                   "A":[3,4,5,6]}, index=[2,2,3,3])

print (df)
   A P1 P2
2  3  a  b
2  4  b  c
3  5  c  d
3  6  a  c

cols = ['P1','P2']
df[cols] = (pd.factorize(df[cols].values.ravel())[0]+1).reshape(-1, len(cols))
print (df)
   A  P1  P2
2  3   1   2
2  4   2   3
3  5   3   4
3  6   1   3

Ты можешь сделать

In [465]: pd.DataFrame((pd.factorize(df.values.ravel())[0]+1).reshape(df.shape), 
                       columns=df.columns)
Out[465]:
   P1  P2
0   1   2
1   2   3
2   3   4
3   1   3
Другие вопросы по тегам