Лучший способ оценить диапазон значений в серии с помощью панд - PullRequest
0 голосов
/ 08 октября 2019

Я новичок в Pandas и уверен, что есть лучший способ выполнить следующую оценку:

Цель: взять диапазон значений для столбца и набрать 0-100 с 0 = min для столбца,100 = макс.

Я достигаю цели с помощью следующего подхода грубой силы, который, я уверен, далек от совершенства.

df['range_old'] = (df['col_to_score'].max() - df['col_to_score'].min())
df['range_new'] = 100
df['score'] = (((df['col_to_score']-df['col_to_score'].min())/df['range_old']))*100

df.drop(columns=['range_old', 'range_new'], inplace=True)

print(df)

Код трудно прочитать или понять позже, Какой более чистый способ сделать что-то подобное, или даже с большим количеством вычислений, чем это, в ячейке?

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

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Если вы можете использовать sklearn и его preprocessing:

from sklearn import preprocessing

min_max_scaler = preprocessing.MinMaxScaler()
scores = df['col_to_score'].values
dummy = scores.reshape(-1,1) #to prevent Expected 2D array error
rescaled_scores = min_max_scaler.fit_transform(dummy) #this will return a 2D array
flattened_list = rescaled_scores.flatten() 
df = df.assign(new_column_name = pd.Series(flattened_list*100)) 
#multiplied with 100 at the end, to rescale betwen 0 and 100
0 голосов
/ 08 октября 2019

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

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1,1,2,5,0], 'B': [10,10,20,50,0], 'C': [20,20,20,50,0]})

Далее, мы можем предварительно вычислить существующие диапазоны, используя apply метод с фрейма данных и работая вдоль оси 0:

ranges = df.apply(lambda col: col.max() - col.min(), axis=0)

Это дает диапазоны 5, 50 и 50 соответственно. Затем мы можем использовать широковещание , чтобы создать новый кадр данных нормализованных оценок в соответствии с этими диапазонами.

scores = df / ranges * 100

Вы можете объединить последние 2 шага в одну строку, если хотите,но я думаю, что это лучше читать в таком видеОкончательный результат, который вы получите:

       A      B      C
0   20.0   20.0   40.0
1   20.0   20.0   40.0
2   40.0   40.0   40.0
3  100.0  100.0  100.0
4    0.0    0.0    0.0

, который, как я считаю, согласуется с вашим намерением.

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

scores_A = df['A'] / ranges['A'] * 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...