Поворот кадра данных Pandas на категориальные переменные - PullRequest
0 голосов
/ 01 октября 2018

У меня есть фрейм данных, содержащий категориальные переменные:

{'SysID': {0: '00721778',
1: '00721778',
2: '00721778',
3: '00721779',
4: '00721779'},
'SoftwareComponent': {0: 'AA13912',
1: 'AA24120',
2: 'AA21612',
3: 'AA30861',
4: 'AA20635'},
'SoftwareSubcomponent': {0: None,
1: 'AK21431',
2: None,
3: 'AK22116',
4: None}}

Я бы хотел развернуть категориальные переменные, игнорируя все значения NULL.Ноль должен быть наполнителем.Вывод должен выглядеть так:

{'SysID': {0: '00721778', 1: '00721779'},
'SoftwareCom-AA13912': {0: '1', 1: '0'},
'SoftwareCom-AA24120': {0: '1', 1: '0'},
'SoftwareCom-AA21612': {0: '1', 1: '0'},
'SoftwareCom-AA30861': {0: '0', 1: '1'},
'SoftwareCom-AA20635': {0: '0', 1: '1'},
'SoftwareSub-AK21431': {0: '1', 1: '0'},
'SoftwareSub-AK22116': {0: '0', 1: '1'}}

Как это сделать?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Вы можете использовать pd.crosstab(), а затем переименовать столбцы данных, прежде чем использовать pd.concat():

df1 = pd.crosstab(df['SysID'], df['SoftwareComponent'])
df1.columns = [df1.columns.name + '-' + i for i in df1.columns]
df2 = pd.crosstab(df['SysID'], df['SoftwareSubcomponent'])
df2.columns = [df2.columns.name + '-' + i for i in df2.columns]
final = pd.concat([df1, df2], axis=1)

Выход:

          SoftwareComponent-AA13912  SoftwareComponent-AA20635  \
SysID                                                            
00721778                          1                          0   
00721779                          0                          1   

          SoftwareComponent-AA21612  SoftwareComponent-AA24120  \
SysID                                                            
00721778                          1                          1   
00721779                          0                          0   

          SoftwareComponent-AA30861  SoftwareSubcomponent-AK21431  \
SysID                                                               
00721778                          0                             1   
00721779                          1                             0   

          SoftwareSubcomponent-AK22116  
SysID                                   
00721778                             0  
00721779                             1 

Используя to_dict(), вы можете вернуть:

{'SoftwareComponent-AA13912': {'00721778': 1, '00721779': 0}, 'SoftwareComponent-AA20635': {'00721778': 0, '00721779': 1}, 'SoftwareComponent-AA21612': {'00721778': 1, '00721779': 0}, 'SoftwareComponent-AA24120': {'00721778': 1, '00721779': 0}, 'SoftwareComponent-AA30861': {'00721778': 0, '00721779': 1}, 'SoftwareSubcomponent-AK21431': {'00721778': 1, '00721779': 0}, 'SoftwareSubcomponent-AK22116': {'00721778': 0, '00721779': 1}}
0 голосов
/ 01 октября 2018

Вы можете использовать pd.crosstab после небольшой очистки.Мы сложим (что будет игнорировать все значения None) и создадим имена столбцов так, как вы хотите, чтобы SofwareCom и SoftwareSub обрабатывались одинаково.

import pandas as pd

df = df.set_index('SysID').stack().reset_index(level=1)
df['val'] = df['level_1'].str[0:11] + '-' + df[0]

pd.crosstab(df.index, df.val).rename_axis('SysID', 0).rename_axis(None,1).reset_index()

Вывод:

      SysID  SoftwareCom-AA13912  SoftwareCom-AA20635  SoftwareCom-AA21612  SoftwareCom-AA24120  SoftwareCom-AA30861  SoftwareSub-AK21431  SoftwareSub-AK22116
0  00721778                    1                    0                    1                    1                    0                    1                    0
1  00721779                    0                    1                    0                    0                    1                    0                    1

Если у вас есть возможность иметь несколько счетчиков и вам просто нужны 1 и 0, то вы можете либо привести тип к bool, затем вернуться к int или просто использовать .clip

pd.crosstab(df.index, df.val).rename_axis('SysID', 0).rename_axis(None,1).clip(0,1).reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...