Как создать новый столбец на основе уравнения и уникальных значений из другого столбца?

#python #pandas #group-by #unique

#python #pandas #группировать по #уникальный

Вопрос:

Представьте, что у меня есть фрейм данных, подобный приведенному ниже. Я хотел бы создать новый столбец df[‘b’] с определенным уравнением, которое принимает максимальное и минимальное значения df[‘a’]. Уравнение должно быть примерно таким:

 import pandas as pd
df = pd.DataFrame({'a':[0.3, 0.1, 0.7, 0.5, 0.4, 0.3, 0.1, 0.6, 0.8, 0.2, 0.2],
                   'group':[1, 1, 3, 3, 5, 5, 3, 3, 6, 6, 1]})

equation = (df['a'] - df['a'].min()) / (df['a'].max() - df['a'].min())
  

Хотя эти максимальные и минимальные значения должны быть связаны с уникальными значениями в df[‘group’]. Итак, мы должны получить максимальные и минимальные значения для группы 1, 3, 5 и 6, а затем применить уравнение к соответствующей строке df[‘a’].

Мне удалось разделить эти значения, но я не знаю, как воспроизвести эту идею.

 a_max = df.groupby('group')['a'].max()
a_min = df.groupby('group')['a'].min()
  

Вывод должен выглядеть следующим образом:

      a     group   b
0   0.3      1     1
1   0.1      1     0
2   0.7      3     1
3   0.5      3     0.67
4   0.4      5     1
5   0.3      5     0
6   0.1      3     0
7   0.6      3     0.6
8   0.8      6     1
9   0.2      6     0
10  0.2      1     0.5
  

Ответ №1:

Мы можем предварительно вычислить max / min по группам:

 groups = df.groupby('group')['a']
amax, amin = groups.transform('max'), groups.transform('min')

df['b'] = (df['a']-amin)/(amax-amin)
  

Или используйте пользовательскую функцию:

 df['b'] = df.groupby('group')['a'].apply(lambda x: (x-x.min())/(x.max()-x.min()) )
  

Первый подход немного более производителен, в то время как второй короче с точки зрения кода.

Оба будут выводить:

       a  group         b
0   0.3      1  1.000000
1   0.1      1  0.000000
2   0.7      3  1.000000
3   0.5      3  0.666667
4   0.4      5  1.000000
5   0.3      5  0.000000
6   0.1      3  0.000000
7   0.6      3  0.833333
8   0.8      6  1.000000
9   0.2      6  0.000000
10  0.2      1  0.500000
  

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

1. Это идеально, мой друг. Большое вам спасибо.

2. Может быть, np.ptp ~ 🙂