Массив в столбцы в фрейме данных

#python #arrays #pandas #machine-learning #logistic-regression

Вопрос:

Я построил функционирующую модель классификации, следуя этому руководству. Я привожу csv-файл, а затем передаю текстовое значение каждой строки в функцию, которая вызывает модель классификации для прогнозирования. Функция возвращает массив, который мне нужно поместить в столбцы в фрейме данных.

Функция:

 def get_top_k_predictions(model,X_test,k):

# get probabilities instead of predicted labels, since we want to collect top 3
np.set_printoptions(suppress=True)
probs = model.predict_proba(X_test)

# GET TOP K PREDICTIONS BY PROB - note these are just index
best_n = np.argsort(probs, axis=1)[:,-k:]

# GET CATEGORY OF PREDICTIONS
preds = [
[(model.classes_[predicted_cat], distribution[predicted_cat])
 for predicted_cat in prediction]
for distribution, prediction in zip(probs, best_n)]


preds=[ item[::-1] for item in preds]
return preds
 

Вызов функции:

 for index, row in df.iterrows():
category_test_features=category_loaded_transformer.transform(df['Text'].values.astype('U'))
df['PREDICTION'] = get_top_k_predictions(category_loaded_model,category_test_features,9)
 

Это результат работы функции:

 [[('Learning Activities', 0.001271131465669718),
  ('Communication', 0.002696299964802842),
  ('Learning Objectives', 0.002774964762863968),
  ('Learning Technology', 0.003557563051027678),
  ('Instructor/TAs', 0.004512712287403168),
  ('General', 0.006675929282872587),
  ('Learning Materials', 0.013051869950436862),
  ('Course Structure', 0.02781481160602757),
  ('Community', 0.9376447176288959)]]
 

Я хочу, чтобы в конце результат выглядел так.

Ответ №1:

Ваша функция возвращает список, содержащий список кортежей? Почему список с двойной вложенностью? Один из способов, который я могу придумать:

 tmp = {}
for index, row in df.iterrows():
    predictions = get_top_k_predictions(...)
    tmp[index] = {
        key: value for key, value in predictions[0]
    }

tmp = pd.DataFrame(tmp).T
df.join(tmp)
 

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

1. Двойной вложенный список-это именно то, как это сделал учебник, которому я следовал. Если есть лучший способ структурировать функцию, я определенно открыт для этого!

2. Я добавил ваш код в свой проект, и он дал мне правильный формат, но он скопировал тот же вывод для первой строки во все остальные строки. tmp = {} для индекса, строки в df.iterrows(): category_test_features=category_loaded_трансформатор.преобразование(df[‘Текст’].значения.тип(‘U’)) прогнозы = get_top_k_predictions(category_loaded_model,category_test_features,9) tmp[индекс] = { ключ: значение для ключа, значение в прогнозах[0] } tmp = pd.Фрейм данных(tmp). T df = df.соединение(tmp)