我有一个这样的数据框:
date A
2015.1.1 10
2015.1.2 20
2015.1.3 30
2015.1.4 40
2015.1.5 50
2015.1.6 60
我需要计算前N行的标准,例如:
date A std
2015.1.1 10 std(10)
2015.1.2 20 std(10,20)
2015.1.3 30 std(10,20,30)
2015.1.4 40 std(10,20,30,40)
2015.1.5 50 std(10,20,30,40,50)
2015.1.6 60 std(10,20,30,40,50,60)
pd.rolling_std用于执行此操作,如何动态更改N
df[['A']].apply(lambda x:pd.rolling_std(x,N))
<class 'pandas.core.frame.DataFrame'>
Index: 75 entries, 2015-04-16 to 2015-07-31
Data columns (total 4 columns):
A 75 non-null float64
dtypes: float64(4)
memory usage: 2.9+ KB
答案 0 :(得分:1)
可以通过在df上调用apply
来完成:
In [29]:
def func(x):
return df.iloc[:x.name + 1][x.index].std()
df['std'] = df[['A']].apply(func, axis=1)
df
Out[29]:
date A std
0 2015.1.1 10 NaN
1 2015.1.2 20 7.071068
2 2015.1.3 30 10.000000
3 2015.1.4 40 12.909944
4 2015.1.5 50 15.811388
5 2015.1.6 60 18.708287
这使用双下标[[]]
在单个列的df上调用apply
,这允许您传递参数axis=1
,以便您可以按行调用函数,然后可以访问索引属性name
和列名属性index
,这样您就可以对df进行切片以计算滚动std
。
您可以向func
添加窗口arg以根据需要修改窗口
修改强>
看起来您的索引是str,以下内容应该有效:
In [39]:
def func(x):
return df.ix[:x.name ][x.index].std()
df['std'] = df[['A']].apply(lambda x: func(x), axis=1)
df
Out[39]:
A std
date
2015.1.1 10 NaN
2015.1.2 20 7.071068
2015.1.3 30 10.000000
2015.1.4 40 12.909944
2015.1.5 50 15.811388
2015.1.6 60 18.708287