Преобразуйте категории в столбцах в несколько столбцов, закодированных как 1 или 0, на основе уникального ключа в Python - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть такие данные:

user    reg       ind       prod   
 A       Asia     Tele       TV
 A       Asia     Bank       Phone
 A       Japan    Tele       Book
 B       US       Fin        Paper
 B       US       Data       Shop
 B       Asia     Tele       TV
 B       Africa   Invest     Book
 C       Asia     Tele       Paper
 C       Japan    Fin        TV

Я хочу преобразовать категории в каждом столбце в отдельные столбцы и пометить их как 1/0, если они есть у пользователя, что-то вроде этого:

User Asia Japan US Africa Tele Bank Fin Data Invest TV Phone Book Paper Shop 
 A     1    1   0   0      1    1    0   0    0      1   1     1    0     0
 B     1    0   1   1      1    0    1   1    1      1   0     1    1     1
 C     1    1   0   0      1    0    1   0    0      1   0     0    1     0

По сути кодирование их, чтобы отметить их связь с каждой категорией.Кроме того, если я могу переименовать столбцы так, чтобы в нем был основной столбец, такой как «reg_Asia» и т. Д. Я попытался использовать Pivot, Pivot_table, Stack, Unstack, но не смог этого сделать.

1 Ответ

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

Используйте get_dummies с set_index и max, если хотите только 0/1 вывод или sum, если хотите значения счетчика:

df = pd.get_dummies(df.set_index('user'), prefix='', prefix_sep='').max(level=0).reset_index()
print (df)
  user  Africa  Asia  Japan  US  Bank  Data  Fin  Invest  Tele  Book  Paper  \
0    A       0     1      1   0     1     0    0       0     1     1      0   
1    B       1     1      0   1     0     1    1       1     1     1      1   
2    C       0     1      1   0     0     0    1       0     1     0      1   

   Phone  Shop  TV  
0      1     0   1  
1      0     1   1  
2      0     0   1  

Если хотите также можно классифицировать данные, создайте MultiIndex:

df1= pd.get_dummies(df.set_index('user')).max(level=0)
df1.columns = df1.columns.str.split('_', expand=True)
print (df1)
        reg                ind                      prod                    
     Africa Asia Japan US Bank Data Fin Invest Tele Book Paper Phone Shop TV
user                                                                        
A         0    1     1  0    1    0   0      0    1    1     0     1    0  1
B         1    1     0  1    0    1   1      1    1    1     1     0    1  1
C         0    1     1  0    0    0   1      0    1    0     1     0    0  1

print (df1['reg'])
      Africa  Asia  Japan  US
user                         
A          0     1      1   0
B          1     1      0   1
C          0     1      1   0
...