有条件的熊猫变换



我有一个非常简单的问题,但是我似乎无法正确解决。考虑此数据框

df = pd.DataFrame({'group' : 
               ['A', 'A', 'A', 'B', 'B'], 'time' : [20, 21, 22, 20, 21],
               'price' : [3.1, 3.5, 3.0, 2.3, 2.1]})

   group price time
0   A   3.1     20
1   A   3.5     21
2   A   3.0     22
3   B   2.3     20
4   B   2.1     21

现在,我想采取每个组价格的标准偏差,但以时间为22之前的条件(我们称其为 early_std)。然后,我想创建一个带有该信息的变量。

预期的结果是

group price time    early_std
A   3.1     20      0.282843
A   3.5     21      0.282843
A   3.0     22      0.282843
B   2.3     20      0.141421
B   2.1     21      0.141421

这是我尝试的:

df['early_std'] = df[df.time < 22].groupby('group').
price.transform(lambda x : x.std())

这几乎有效,但在 time = 22上给出了缺少的价值:

 group price    time early_std
0   A   3.1     20  0.282843
1   A   3.5     21  0.282843
2   A   3.0     22  NaN
3   B   2.3     20  0.141421
4   B   2.1     21  0.141421

我还尝试了应用程序,我认为它有效,但是我需要重置索引,这是我宁愿避免的(我有一个大数据集,我需要反复执行此操作)

early_std2 = df[df.time < 22].groupby('group').price.std()
df.set_index('group', inplace=True)
df['early_std2'] = early_std2
    price   time early_std  early_std2
group               
A   3.1     20  0.282843    0.282843
A   3.5     21  0.282843    0.282843
A   3.0     22  NaN         0.282843
B   2.3     20  0.141421    0.141421
B   2.1     21  0.141421    0.141421

谢谢!

看起来您只需要在第一个代码中添加fillna()即可展开std值:

df['early_std'] = df[df.time < 22].groupby('group')['price'].transform(pd.Series.std)
df['early_std'] = df.groupby('group')['early_std'].apply(lambda x: x.fillna(x.max()))
df

获得:

  group  price  time  early_std
0     A    3.1    20      0.283
1     A    3.5    21      0.283
2     A    3.0    22      0.283
3     B    2.3    20      0.141
4     B    2.1    21      0.141

编辑:我已将ffill更改为更通用的fillna,但是您也可以使用链式.bfill().ffill()实现相同的结果。

您的第二种方法非常接近您要实现的目标。这可能不是最有效的方法,但对我有用:

df['early_std'] = 0
for index,value in early_std2.iteritems():
    df.early_std[df.group==index] = value

最新更新