Как кодировать, когда у вас есть несколько категорий в столбце - PullRequest
0 голосов
/ 24 декабря 2018

Мой фрейм данных выглядит следующим образом

Фрейм данных Pandas с несколькими категориальными переменными для пользователя

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

Я пытался напрямую использовать манекены pandas, но не получил желаемого результата.Кто-нибудь может мне помочь через это ??

Ответы [ 4 ]

0 голосов
/ 24 декабря 2018

Предполагая следующий фрейм данных:

   user name
0     1    a
1     1    b
2     1    c
3     1    d
4     2    a
5     2    b
6     2    c
7     3    d
8     3    e
9     3    f

Вы можете groupby пользователя и затем использовать get_dummmies :

import pandas as pd

# create data-frame
data = [[1, 'a'], [1, 'b'], [1, 'c'], [1, 'd'], [2, 'a'],
        [2, 'b'], [2, 'c'], [3, 'd'], [3, 'e'], [3, 'f']]
df = pd.DataFrame(data=data, columns=['user', 'name'])

# group and get_dummies
grouped = df.groupby('user')['name'].apply(lambda x: '|'.join(x))
print(grouped.str.get_dummies())

Выходные данные

      a  b  c  d  e  f
user                  
1     1  1  1  1  0  0
2     1  1  1  0  0  0
3     0  0  0  1  1  1

В качестве примечания вы можете сделать все это в одну строку:

result = df.groupby('user')['name'].apply(lambda x: '|'.join(x)).str.get_dummies()
0 голосов
/ 24 декабря 2018

Вы можете разделить каждую строку в name, используя r'(\d+)', чтобы отделить цифры от букв, и использовать pd.crosstab:

d = pd.DataFrame(df.name.str.split(r'(\d+)').values.tolist())
pd.crosstab(columns=d[2], index=d[1], values=d[1], aggfunc='count')
0 голосов
/ 24 декабря 2018

Вы можете попробовать метод доступа str get_dummies со столбцом groupby user:

df.name.str.get_dummies().groupby(df.user).sum()

Пример

С учетом вашего образца DataFrame

df = pd.DataFrame({'user': [1]*4 + [2]*4 + [3]*3,
                   'name': ['a', 'b', 'c', 'd']*2 + ['d', 'e', 'f']})

df_dummies = df.name.str.get_dummies().groupby(df.user).sum()
print(df_dummies)

[out]

      a  b  c  d  e  f
user                  
1     1  1  1  1  0  0
2     1  1  1  1  0  0
3     0  0  0  1  1  1
0 голосов
/ 24 декабря 2018

IIUC, ваш user пуст и все включено name.Если это так, вы можете

pd.pivot_table(df, index=df.name.str[0], columns=df.name.str[1:].values, aggfunc='count').fillna(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...