Кодирование Dataframe отличается от One-Hot - PullRequest
1 голос
/ 25 мая 2020

Предположим, у меня есть подобный df, который регистрирует выбор игровых персонажей каждым из 6 игроков (3v3) в компьютерной игре.

data = {'Pick_1_team1': ['A','A','A','B','C'],
        'Pick_2_team1': ['D','D','E','F','F'],
        'Pick_3_team1': ['G','G','A','M','O'],
        'Pick_1_team2': ['Q','Q','S','S','A'],
        'Pick_2_team2': ['V','W','X','A','B'],
        'Pick_3_team2': ['R','X','W','W','R']}

df = pd.DataFrame(data)
df_enc = pd.get_dummies(df)

Когда я использую get_dummies panda, я получаю разреженный df со следующей структурой (пример, не фактическая кодировка из примера df)

Каждый слот выбора имеет все возможные варианты выбора (AZ) для обеих команд.

| P1_T1_A | P1_T1_B | P1_T1_C | ... | P2_T1_A | ... | P3_T1_Z | ... | P1_T2_A | P1_T2_B | ... | P3_T2_Z |
|---------|---------|---------|-----|---------|-----|---------|-----|---------|---------|-----|---------|
| 0       | 0       | 1       | ... | 0       | ... | 0       | ... | 1       | 0       | ... | 1       |
| 1       | 0       | 0       | ... | 0       | ... | 0       | ... | 0       | 1       | ... | 1       |
| 1       | 0       | 0       | ... | 0       | ... | 0       | ... | 0       | 0       | ... | 0       |

Что нормально, но если учесть большее пространство ввода (с более чем 150 возможными выборами), таблица станет очень большой. Чтобы сделать его более управляемым, я подумал о том, чтобы каким-то образом кодировать его в следующий формат:

Один столбец на категорию (символ) x 2 для каждой команды, 1, если этот персонаж был выбран, 0, если нет.

| T1_A | T1_B | T1_C | ... | T1_Z | ... | T2_A | T2_B | ... | T2_Z |
|------|------|------|-----|------|-----|------|------|-----|------|
| 0    | 0    | 1    | ... | 0    | ... | 1    | 1    | ... | 1    |
| 1    | 1    | 1    | ... | 0    | ... | 0    | 0    | ... | 1    |
| 1    | 0    | 0    | ... | 0    | ... | 0    | 0    | ... | 0    |

Это ограничит количество функций до количества выборов x количество команд (26 букв * 2 команды) вместо возможных выборов x количество выборов x количество команд (26 букв * 3 выбора * 2 команды). панда сделать это через любую встроенную функцию? Если нет, то какой был бы самый простой способ go об этом?

Любая помощь приветствуется! Спасибо.

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Используйте get_dummies с агрегатом max, если нужны только 1,0 значения или sum, если нужны значения подсчета:

df_enc = (pd.get_dummies(df.rename(columns=lambda x:x.split('_', 2)[-1].replace('team','T')))
            .max(axis=1, level=0)
            .sort_index(axis=1, level=0))
print (df_enc)
   T1_A  T1_B  T1_C  T1_D  T1_E  T1_F  T1_G  T1_M  T1_O  T2_A  T2_B  T2_Q  \
0     1     0     0     1     0     0     1     0     0     0     0     1   
1     1     0     0     1     0     0     1     0     0     0     0     1   
2     1     0     0     0     1     0     0     0     0     0     0     0   
3     0     1     0     0     0     1     0     1     0     1     0     0   
4     0     0     1     0     0     1     0     0     1     1     1     0   

   T2_R  T2_S  T2_V  T2_W  T2_X  
0     1     0     1     0     0  
1     0     0     0     1     1  
2     0     1     0     1     1  
3     0     1     0     1     0  
4     1     0     0     0     0  
1 голос
/ 25 мая 2020

Вы можете сделать это, сначала выбрав одну команду с filter, stack данными и используя str.get_dummies, затем groupby level = 0 (строки в исходной df) и sum. add_prefix в столбцы перед concat для обеих команд, например:

df_ = pd.concat([
            (df.filter(like=f'Pick_{i}').stack()
               .str.get_dummies()
               .groupby(level=0).sum()
               .add_prefix(f'T{i}_')
            ) for i in [1,2] ], 
            axis=1)
print (df_)
   T1_A  T1_B  T1_C  T1_D  T1_E  T1_F  T1_G  T1_M  T1_O  T2_A  T2_B  T2_Q  \
0     1     0     0     1     0     0     1     0     0     0     0     1   
1     1     0     0     1     0     0     1     0     0     0     0     1   
2     2     0     0     0     1     0     0     0     0     0     0     0   
3     0     1     0     0     0     1     0     1     0     1     0     0   
4     0     0     1     0     0     1     0     0     1     1     1     0   

   T2_R  T2_S  T2_V  T2_W  T2_X  
0     1     0     1     0     0  
1     0     0     0     1     1  
2     0     1     0     1     1  
3     0     1     0     1     0  
4     1     0     0     0     0  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...