Превращение последовательности / двухмерного массива в столбец фрейма данных в Pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Поэтому я использую свою ранее обученную модель для прогнозирования новых данных

 y_pred_aplikasi = model.predict(X_aplikasi)
y_pred_aplikasi
  

Он возвращает

 array([[7.7066602e-07, 9.9993092e-01, 4.6858725e-07],
       [7.1568817e-02, 4.3571211e-07, 7.3567069e-01],
       [9.8825598e-01, 6.3803792e-03, 4.4066067e-07],
       ...,
       [3.8332163e-15, 1.0000000e 00, 1.4775689e-11],
       [1.8400473e-14, 1.0000000e 00, 6.1960957e-11],
       [7.0748132e-01, 5.9783965e-02, 5.7850748e-02]], dtype=float32)
​
  

Я хочу превратить эту последовательность во что-то вроде этого, при этом наибольшее значение каждой части станет 1, а остальное 0.

 A   B   C
0   1   0
0   0   1
1   0   0
....
1   0   0
0   0   1
1   0   0
  

как я могу добиться этого с помощью pandas?

Ответ №1:

Учитывая, что это ваш массив:

 In [841]: a
Out[841]: 
array([[7.7066602e-07, 9.9993092e-01, 4.6858725e-07],
       [7.1568817e-02, 4.3571211e-07, 7.3567069e-01],
       [9.8825598e-01, 6.3803792e-03, 4.4066067e-07],
       [3.8332163e-15, 1.0000000e 00, 1.4775689e-11],
       [1.8400473e-14, 1.0000000e 00, 6.1960957e-11],
       [7.0748132e-01, 5.9783965e-02, 5.7850748e-02]])
  

Преобразуйте приведенный выше массив в фрейм данных, используя pd.DataFrame constructor :

 In [851]: df = pd.DataFrame(a, columns=['A', 'B', 'C'])

In [852]: df
Out[852]: 
              A             B             C
0  7.706660e-07  9.999309e-01  4.685873e-07
1  7.156882e-02  4.357121e-07  7.356707e-01
2  9.882560e-01  6.380379e-03  4.406607e-07
3  3.833216e-15  1.000000e 00  1.477569e-11
4  1.840047e-14  1.000000e 00  6.196096e-11
5  7.074813e-01  5.978397e-02  5.785075e-02
  

Замените max значение на 1 , else 0 , используя df.where и df.max(axis=1) :

 In [854]: df = df.eq(df.where(df != 0).max(1), axis=0).astype(int)

In [855]: df
Out[855]: 
   A  B  C
0  0  1  0
1  0  0  1
2  1  0  0
3  0  1  0
4  0  1  0
5  1  0  0
  

Ответ №2:

Ручной цикл по каждому элементу может работать, но не уверен, насколько это возможно для вашего приложения.

 for i in range(len(y_pred_aplikasi)):
    for j in range(3):
    # for j in range(len(y_pred_aplikasi[i])): # to be more dynamic
        if y_pred_aplikasi[i][j] == y_pred_aplikasi[i].max():
            y_pred_aplikasi[i][j] = 1
        else:
            y_pred_aplikasi[i][j] = 0
            
            
y_pred_aplikasi.astype(int)

Out[5]:
array([[0, 1, 0],
       [0, 0, 1],
       [1, 0, 0],
       ...,
       [0, 1, 0],
       [0, 1, 0],
       [1, 0, 0]])