#python #pandas #dataframe #sklearn-pandas
#python #pandas #фрейм данных #sklearn-pandas
Вопрос:
я использую из sklearn.предварительная обработка импортирует MinMaxScaler со следующим кодом и набором данных:
df = pd.DataFrame({
"A" : [-0.5624105,
-0.5637749,
0.2973856,
0.619784,
0.007297921,
0.8146919,
0.1082434,
-0.2311236,
-0.6945567,
-0.6807524,
-0.1017431,
0.5889628,
0.5384794,
0.3906553,
0.3843442,
0.4408366,
0.4035791,
0.05258237,
-0.4847771
],
"B" : [-0.5068743,
0.1422121,
0.6444226,
0.4959088,
-0.2260773,
0.3420533,
0.2346546,
0.1177824,
-0.7701161,
-0.7566853,
-0.5091485,
0.4509938,
0.4209853,
0.304058,
0.3753832,
0.6958977,
0.6763205,
0.05536954,
-0.9857719
]})
min_max_scaler = MinMaxScaler(feature_range=(0,255))
print(df)
df[df.columns] = min_max_scaler.fit_transform(df[df.columns])
print(df)
print(type(df))
я хочу масштабировать его с наименьшим значением во всем наборе данных и наибольшим значением во всем наборе данных как я могу управлять этим, используя тот же код? возможно ли это?
A B
0 -0.562411 -0.506874
1 -0.563775 0.142212
2 0.297386 0.644423
3 0.619784 0.495909
4 0.007298 -0.226077
5 0.814692 0.342053
6 0.108243 0.234655
7 -0.231124 0.117782
8 -0.694557 -0.770116
9 -0.680752 -0.756685
10 -0.101743 -0.509149
11 0.588963 0.450994
12 0.538479 0.420985
13 0.390655 0.304058
14 0.384344 0.375383
15 0.440837 0.695898
16 0.403579 0.676320
17 0.052582 0.055370
18 -0.484777 -0.985772
A B
0 22.327190 72.617646
1 22.096664 171.041874
2 167.596834 247.194572
3 222.068703 224.674680
4 118.584127 115.196304
5 255.000000 201.344798
6 135.639699 185.059394
7 78.300845 167.337476
8 0.000000 32.700971
9 2.332350 34.737551
10 100.160748 72.272798
11 216.861207 217.863993
12 208.331620 213.313653
13 183.355519 195.583380
14 182.289206 206.398778
15 191.834063 255.000000
16 185.539101 252.031411
17 126.235309 157.873501
18 35.443994 0.000000
мне не нужно разное отображение для каждого столбца, мне нужно сопоставить его, используя -0.985772 0.814692 (строка столбца b 18, строка столбца a 5)
Комментарии:
1. Вероятно, быстрее всего сначала сделать его
np.array
, а затемarray = (array - minimum) / (maximum - minimum) * 255
(масштабировать от 0 до 255) и затем преобразовать его обратно
Ответ №1:
У вас есть 2 способа сделать это:
# Manually:
min_value, max_value = df.min().min(), df.max().max()
scaled1 = (df - min_value) * 255 / (max_value - min_value)
# Using MinMaxScaler
min_max_scaler = MinMaxScaler(feature_range=(0,255))
# Stack everything into a single column to scale by the global min / max
tmp = df.to_numpy().reshape(-1,1)
scaled2 = min_max_scaler.fit_transform(tmp).reshape(len(df), 2)
Оба возвращают один и тот же результат:
np.isclose(scaled1, scaled2).all()
# True
Вы можете создать новый фрейм данных с масштабированными значениями:
scaled = pd.DataFrame(scaled1, index=df.index, columns=df.columns)
Или назначьте их обратно df
:
df.loc[:] = scaled1