Одно горячее кодирование фрейма данных Pandas на основе заголовков столбцов

#python #pandas #scikit-learn

#python #pandas #scikit-learn

Вопрос:

Я никогда раньше этого не делал — и, возможно, есть более простой способ сделать это.

У меня есть df, подобный этому:

 parent_org_name ( MA,)  (MAR,)  (ART,)  (RTI,)  (TIN,)
0    MARTINS    NaN      NaN     NaN     NaN    NaN
1   111 SOUTH   NaN      NaN     NaN     NaN    NaN 
2   247 CUST    NaN      NaN     NaN     NaN    NaN
3   3M          NaN      NaN     NaN     NaN    NaN 
4   A. K. ENT   NaN      NaN     NaN     NaN    NaN 
  

Который я создал вручную. Изначально я начал с 2 фреймов данных:

1: df1 только с parent_org_name единственным столбцом

 #df1
parent_org_name
0    MARTINS
1   111 SOUTH
2   247 CUSTOMER PVT. LTD.
3   3M
4   A. K. ENTERPRISE
  

2: df2 со всеми именами столбцов ( MA, MAR, ART и т.д.) В одном списке в одном столбце в одной строке

 #df2
parent_trigram
0   [ MA, MAR, ART, RTI, TIN]
  

Я пытаюсь упорядочить столбцы в алфавитном порядке, а затем одно горячее кодирование этого df , чтобы сказать:

 if column name in df isin parent_org_name then 1 else 0
  

Итак, это результат, который я ищу:

 parent_org_name ( MA,)  (ART,)  (MAR,)  (RTI,)  (TIN,)
0    MARTINS    1        1       1       1      1
1   111 SOUTH   0        0       0       0      0   
2   247 CUST    0        0       0       0      0
3   3M          0        0       0       0      0   
4   A. K. ENT   0        0       0       0      0   
  

Конечная цель — объединить каждую из этих строк в столбец списков, а затем использовать этот столбец в моделях ml.

Комментарии:

1. Это str.содержит

2. не уверен, помогает ли это, но sklearn.preprocessing.OneHotEncoder — документация

Ответ №1:

 df = pd.DataFrame({
    'parent_org_name' : [" MARTINS", "111 SOUTH", "247 CUST", "3M", "A. K. ENT"]
})

for c in [' MA', 'MAR', 'ART', 'RTI', 'TIN']:
  df[c] = df['parent_org_name'].apply(lambda x: int(c in x))

print (df)
  

Вывод

 parent_org_name  MA MAR ART RTI TIN
0    MARTINS    1   1   1   1   1
1   111 SOUTH   0   0   0   0   0
2   247 CUST    0   0   0   0   0
3   3M          0   0   0   0   0
4   A. K. ENT   0   0   0   0   0
  

Ответ №2:

Вот что я придумал:

 mlb = MultiLabelBinarizer(sparse_output=True)

mlb_df = df.join(
            pd.DataFrame.sparse.from_spmatrix(
                mlb.fit_transform(df.pop('parent_trigram')),
                index=df.index,
                columns=mlb.classes_))
mlb_df
  

Приводит к этому:
введите описание изображения здесь