大熊猫的条件转换

时间:2015-05-14 17:36:58

标签: python pandas

我有一个非常简单的问题,但我似乎无法做到正确。 考虑这个数据框

early_std

现在我想取每组价格的标准差,但条件是它在22之前(让我们称之为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

我也尝试使用apply,我认为它有效,但我需要重置索引,这是我宁愿避免的(我有一个大型数据集,我需要反复这样做)

{{1}}

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

看起来您只需要在第一个代码中添加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()来获得相同的结果。