В настоящее время у меня есть приведенный ниже код для горячего кодирования информационного кадра pandas с использованием словаря, в котором ключи - это имена элементов, а значения - это список значений для функции.
def dummy_encode_dataframe(self, df, dummy_values_dict):
for (feature, dummy_values) in sorted(dummy_values_dict.items()):
for dummy_value in sorted(dummy_values):
dummy_name = u'%s_%s' % (feature, dummy_value)
df[dummy_name] = (df[feature] == dummy_value).astype(float)
del df[feature]
return df
dummy_values_dict
имеетструктура:
feature name (key) list of possible values (strings)
--------- ---------------------------------
F1 ['A', 'B', 'C', 'MISSING']
F2 ['D', 'E', 'F', 'MISSING']
F3 ['G', 'H', 'I']
с образцом ввода / вывода:
df (one row):
====
F1 F2 F3
--- ----- -----
'A' 'Q' 'H'
ожидаемый результат:
df_output:
====
F1_A F1_B F1_C F1_MISSING F2_D F2_E F2_F F2_MISSING F3_G F3_H F3_I
--- ---- ----- --------- ---- ---- ---- ---------- ---- ---- -----
1 0 0 0 0 0 0 0 0 1 0
Проблема в том, что цикл for занимает слишком много времени длязапустить. Есть ли способ оптимизировать его?
ОБНОВЛЕНИЕ 1: Из комментария об использовании OneHotEncoder в scikit-learn ... Можете ли вы уточнить этот фрагмент кода, чтобы получить желаемый результат?
import pandas as pd
df = pd.DataFrame(columns=['F1', 'F2', 'F3'])
df.loc[0] = ['A', 'Q', 'H']
dummy_values_dict = { 'F1': ['A', 'B', 'C', 'MISSING'], 'F2': ['D', 'E', 'F', 'MISSING'], 'F3': ['G', 'H', 'I'] }
# import OneHotEncoder
from sklearn.preprocessing import OneHotEncoder
categorical_cols = sorted(dummy_values_dict.keys())
# instantiate OneHotEncoder
# todo: encoding...