在熊猫组内规范化

时间:2020-06-04 03:20:36

标签: python r pandas

我已经阅读了几个类似的问题,即使问题很简单,也无法找到适合我要尝试的答案的答案。我有一组具有分组变量,位置和该位置值的数据:

Sample    Position    Depth
A         1           2
A         2           3
A         3           4
B         1           1
B         2           3
B         3           2

我想生成一个内部标准化深度的新列,如下所示:

Sample    Position    Depth    NormalizedDepth
A         1           2        0
A         2           3        0.5
A         3           4        1
B         1           1        0
B         2           3        1
B         3           2        0.5

这基本上由公式NormalizedDepth = (x - min(x))/(max(x)-min(x))表示,使得最小值和最大值属于该组。

我知道如何使用dplyr中的R进行以下操作:

depths %>% 
  group_by(Sample) %>%
  mutate(NormalizedDepth = 100 * (Depth - min(Depth))/(max(Depth) - min(Depth)))

我无法弄清楚如何使用pandas进行分组和应用,但是似乎没有一个可以复制我想要的内容。

2 个答案:

答案 0 :(得分:3)

我们将transform与{{1}一起使用mutate(与R dplyr中的ptp相同)(得到最大值和最小值之间的差异)

import numpy as np

g=df.groupby('Sample').Depth
df['new']=(df.Depth-g.transform('min'))/g.transform(np.ptp)
0    0.0
1    0.5
2    1.0
3    0.0
4    1.0
5    0.5
Name: Depth, dtype: float64

答案 1 :(得分:0)

按Sample Series的值对数据框进行分组,对(split)Depth Series的每个值应用一个匿名函数,该值执行最小最大归一化,将结果分配给df DataFrame的NormalizedDepth Series(请注意效率不如YOBEN_S上面的答案):

import pandas as pd    
df['NormalizedDepth'] = df.groupby('Sample').Depth.apply(lambda x: (x - min(x))/(max(x)-min(x)))