Коды категорий данных в пандах из двух столбцов
У меня есть датафрейм для панд, где две колонки соответствуют именам людей. Столбцы связаны, и одно и то же имя означает одного и того же человека. Я хочу назначить код категории так, чтобы он действовал для всего пространства имен.
Например, мой фрейм данных
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