如何根据等式和其他列的唯一值创建新列?

How to create new column based on an equation and unique values from other column?

假设我有一个像下面这样的数据框。我想创建一个新列 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

我们可以按组预先计算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