Панды, как применить нормализацию к столбцу с условием - PullRequest
0 голосов
/ 13 октября 2019

У меня есть фрейм данных, как показано ниже, и я хочу нормализовать значения для каждого клиента. Пожалуйста, помогите мне, как достичь решения. Я пробовал minmaxscaler из sklearn в столбце полной цены, но он дает значения, близкие к нулю.

Датафрейм

Customer   price
  A          0
  A          3
  A          7
  A          0
  A          0
  B          2
  B          2
  B          0
  C          5
  C          1
  D          0
  D          0
  D          15 
  D          0

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Если вы хотите на клиента ,

df.groupby('Customer').price.transform(\
              lambda s: MinMaxScaler().fit_transform(s.values.reshape(-1,1)).ravel()
)

0     0.000000
1     0.428571
2     1.000000
3     0.000000
4     0.000000
5     1.000000
6     1.000000
7     0.000000
8     1.000000
9     0.000000
10    0.000000
11    0.000000
12    1.000000
13    0.000000
Name: price, dtype: float64
0 голосов
/ 13 октября 2019

Вы можете решить это без MinMaxScaler:

df["norm"]=df.groupby("Customer").apply(\
lambda grp: grp.price.div(grp.price.max()) ).values                         

       Customer  price      norm
    0         A      0  0.000000
    1         A      3  0.428571
    2         A      7  1.000000
    3         A      0  0.000000
    4         A      0  0.000000
    5         B      2  1.000000
    6         B      2  1.000000
    7         B      0  0.000000
    8         C      5  1.000000
    9         C      1  0.200000
    10        D      0  0.000000
    11        D      0  0.000000
    12        D     15  1.000000
    13        D      0  0.000000

Редактировать: Для другой нормализации вы можете разделить на grp.price.sum () вместо grp.price.max ().

Edit2: Для других столбцов вы можете сделать:

    cols=["price","weights"]  # group the requested column names
    df2= df.groupby("Customer").apply(lambda grp: grp[cols].div(grp[cols].max()) )

    new_df=pd.concat([df,df2],axis=1)

Вы должны переименовать последние, нормализованные столбцы:

    new_df.columns                                                                                                       
    Index(['Customer', 'price', 'weight', 'price', 'weight'], dtype='object')
    new_df.columns= df.columns.append(pd.Index(["norm_"+c for c in df2.columns]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...