#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’