如何根据等式和其他列的唯一值创建新列?
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
假设我有一个像下面这样的数据框。我想创建一个新列 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