我有一个非常简单的问题,但我似乎无法做到正确。 考虑这个数据框
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}}
谢谢!
答案 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()
来获得相同的结果。