Python - можно ли объединить столбец после использования pandas get_dummies?

вот мой пример df

         doc_num
doc1 doc2 
 A    B    U123
 A    C    U123
 A    D    U124
 B    C    U126
 B    D    U126

и я использую

pd.get_dummies(df.doc_num).sort_index(level=0)

сделать такую ​​векторную матрицу

           U123 U124 U126
doc1 doc2  
 A    B     1    0    0
 A    C     1    0    0
 A    D     0    1    0
 B    C     0    0    1
 B    D     0    0    1

но я хотел бы объединить doc1 и doc2, а затем создать новый столбец, чтобы увидеть ожидаемый результат, подобный этому

       U123 U124 U126
doc_3  
 A,B     1    0    0
 A,C     1    0    0
 A,D     0    1    0
 B,C     0    0    1
 B,D     0    0    1

Является ли это возможным? заранее спасибо

3
0
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я считаю, что вам нужно присоединиться к обоим уровням MultiIndex, установить имя индекса rename_axis:

df1 = pd.get_dummies(df.doc_num).sort_index(level=0)
df1.index = df1.index.map(','.join)
df1 = df1.rename_axis('doc_3')
print (df1)
       U123  U124  U126
doc_3                  
A,B       1     0     0
A,C       1     0     0
A,D       0     1     0
B,C       0     0     1
B,D       0     0     1

И при необходимости добавьте reset_index для столбца:

df1 = df1.reset_index()
print (df1)
  doc_3  U123  U124  U126
0   A,B     1     0     0
1   A,C     1     0     0
2   A,D     0     1     0
3   B,C     0     0     1
4   B,D     0     0     1

Или сначала reset_index для столбцов из MultiIndex с pop для извлечения столбцов, если требуется индекс:

df1 = pd.get_dummies(df.doc_num).sort_index(level=0).reset_index()
df1.index =  df1.pop('doc1') + ',' + df1.pop('doc2')
df1 = df1.rename_axis('doc_3')
print (df1)
       U123  U124  U126
doc_3                  
A,B       1     0     0
A,C       1     0     0
A,D       0     1     0
B,C       0     0     1
B,D       0     0     1

Или используйте insert для нового столбца:

df1 = pd.get_dummies(df.doc_num).sort_index(level=0).reset_index()
df1.insert(0, 'doc_3',  df1.pop('doc1') + ',' + df1.pop('doc2'))

print (df1)
  doc_3  U123  U124  U126
0   A,B     1     0     0
1   A,C     1     0     0
2   A,D     0     1     0
3   B,C     0     0     1
4   B,D     0     0     1

@ U9-Forward - Добавлены оба решения - и для индекса, и для столбцов.

jezrael 26.10.2018 07:46

В дополнение к ответу @ jezrael вам нужна векторная матрица, так что сделайте:

df1=pd.get_dummies(df.doc_num)
df1.insert(0, 'doc_3',  df['doc1'] + ',' + df['doc2'])
print(df1.set_index('doc_3'))

Или:

df1=pd.get_dummies(df.doc_num)
df1['doc_3']=df.pop('doc1') + ',' + df.pop('doc2')
print(df1.set_index('doc_3'))

Весь выход:

       U123  U124  U126
doc_3                  
A,B       1     0     0
A,C       1     0     0
A,D       0     1     0
B,C       0     0     1
B,D       0     0     1

Теперь вы действительно получаете желаемый результат.

Вы можете попробовать код ниже. Он объединит два столбца в один. Также добавьте "," между ними.

df['doc_3'] = df['doc1'] + "," + df['doc2']

Затем вы можете удалить первые два столбца

Другие вопросы по теме