pandas rolling_max with groupby

时间:2015-05-20 08:40:45

标签: python pandas

我有什么:

Sym  Date    close
A   1-Jan   45
A   2-Jan   15
A   3-Jan   55
B   1-Jan   41
B   2-Jan   87
B   3-Jan   82
C   1-Jan   33
C   2-Jan   15
C   3-Jan   46

我需要什么

Sym  Date  close  rolling_max_2day
A   1-Jan   45    NaN
A   2-Jan   15    45
A   3-Jan   55    55
B   1-Jan   41    NaN
B   2-Jan   87    87
B   3-Jan   82    87
C   1-Jan   33    NaN
C   2-Jan   15    33
C   3-Jan   46    46

数据框df具有多个索引(Sym,Date)

我试过这样的话:

df['rolling_max_2day'] = df.groupby(level=['sym']).apply(lambda x:pd.rolling_max(x['close'].values,2))

它不会返回任何错误,但它也会返回列rolling_max_2day

中的所有空值

但是,如果只是这段代码,而不是附加到df,我可以获得正确的系列。

df.groupby(level=['sym']).apply(lambda x:pd.rolling_max(x['close'].values,2))

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用df.groupby('Sym')['close']代替

pd.rolling_max(x, 2)上申请
In [124]: df['rolling_max_2day'] = (df.groupby('Sym')['close']
                                      .apply(lambda x:pd.rolling_max(x, 2)))

In [125]: df
Out[125]:
  Sym   Date  close  rolling_max_2day
0   A  1-Jan     45               NaN
1   A  2-Jan     15                45
2   A  3-Jan     55                55
3   B  1-Jan     41               NaN
4   B  2-Jan     87                87
5   B  3-Jan     82                87
6   C  1-Jan     33               NaN
7   C  2-Jan     15                33
8   C  3-Jan     46                46
相关问题