Как нормализовать (минимальный / максимальный) конкретный столбец в python? (Dataframe)

#python #pandas #numpy #dataframe

#python #pandas #numpy #dataframe

Вопрос:

Я работал над нормализацией данных на основе нормализации Min-Max. Мои наборы данных представляют собой фреймы данных, хранящиеся в списке df_mols, как показано ниже.

 df_mols[0]:   
         frequency  Molecule0
 0        -326.0   2.604015
 1        -323.0   2.624186
 2        -321.0   2.644598
 3        -318.0   2.665254
 4        -316.0   2.686159
 ...         ...        ...
 1996     4589.0   4.565467
 1997     4591.0   4.512142
 1998     4594.0   4.459744
 1999     4596.0   4.408251
 2000     4598.0   4.357645
 
df_mols[1]:      
          frequency  Molecule1
 0        -357.0   0.368472
 1        -354.0   0.371063
 2        -352.0   0.373683
 3        -350.0   0.376332
 4        -347.0   0.379010
 ...         ...        ...
 1996     4293.0   0.538391
 1997     4295.0   0.532088
 1998     4297.0   0.525894
 1999     4300.0   0.519807
 2000        NaN        NaN
  

Я хочу нормализовать только все столбцы молекул.
То, что я делал до сих пор, было,

 from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler()

for i in df_mols:
  i['frequency']=i['frequency'].apply(np.rint) # This was to make frequency values into int
  i[:,1]=scaler.fit_transform(i[:,1])
  

и произошла ошибка, подобная приведенной ниже

 /usr/local/lib/python3.6/dist-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    554                     "Reshape your data either using array.reshape(-1, 1) if "
    555                     "your data has a single feature or array.reshape(1, -1) "
--> 556                     "if it contains a single sample.".format(array))
    557 
    558         # in the future np.flexible dtypes will be handled like object dtypes

ValueError: Expected 2D array, got 1D array instead:
array=[2.60401472 2.62418641 2.64459837 ... 4.45974369 4.4082515  4.35764454].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
  

Я пытался изменить форму, но не смог этого сделать. должен ли я создавать новые серии, а затем обновлять значение? или я должен решить эту проблему?
Спасибо 🙂

Ответ №1:

Перед изменением формы вы можете использовать метод object .to_numpy() для преобразования вашего pd.Series в np.ndarray.

Ответ №2:

Я не уверен, что это то, что вы ищете, но я думаю, что что-то подобное сработало бы.

 import pandas as pd
from sklearn.preprocessing import normalize

data = [[-326.0, 2.604015], [-323.0, 2.624186], [-321.0, 2.644598], [-318.0, 2.665254]]

df = pd.DataFrame(data, columns = ['frequency', 'Molecule0'])

print("Shape of column: ", df['Molecule0'].shape)

normalized_data = normalize(df['Molecule0'].to_numpy().reshape(1, -1), norm='max')[0]

print("Normalized data: ", normalized_data)

df['Molecule0'] = normalized_data
print(df)
  

Когда я запустил это, я получил следующий результат…

Форма столбца: (4,)
Нормализованные данные: [0.9770232 0.98459134 0.99224989 1. ]

частота Molecule0
0 -326.0 0.977023
1 -323.0 0.984591
2 -321.0 0.992250
3 -318.0 1.000000

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

1. Спасибо! Однако, что, если есть почти 70 молекул, так что я хочу внести изменения с помощью цикла for? / общая версия?

2. @sopL Все молекулы находятся в одном фрейме данных?

3. Нет, каждая молекула находится в разных фреймах данных, но в том же iloc[1] (например: [frequency, Molecule0],[frequency, Molecule1],) и фреймах данных в df_mols(список).

4. Извините за мое плохое объяснение. df_mol [0] = это серия со столбцами ‘frequency’ и ‘Molecule0’, а для df_mol [1] = это столбцы ‘frequency’ и ‘Molecule1’