我有一个由块分开的df,如下所示:
A = pd.DataFrame([[1, 5, 2, 0], [2, 4, 4, 0], [3, 3, 1, 1], [4, 2, 2, 0], [5, 1, 4, 0], [2, 4, 4, 1]],
columns=['A', 'B', 'C', 'D'], index=[1, 2, 3, 4, 5, 6,])
在此示例中,块大小为3,并且我们有2个块(由“D”列中的元素1发出信号)。我需要在每个块内进行滚动计算,这涉及2列。具体来说,我需要创建一个列'E',它等于列'B'减去列'C'的滚动最小值,在函数中:
def retracement(x):
return x['B'] - pd.rolling_min(x['C'], window=3)
我需要为每个块应用上面的公式。所以following this recipe我试过了:
chunk_size = 3
A['E'] = A.groupby(np.arange(len(A))//chunk_size).apply(lambda x: retracement(x))
ValueError: Wrong number of items passed 3, placement implies 1
输出如下:
A B C D E
1 1 5 2 0 3
2 2 4 4 0 2
3 3 3 1 1 2
4 4 2 2 0 0
5 5 1 4 0 -1
6 2 4 4 1 2
由于
更新
按照@EdChum建议不起作用,我得到了
TypeError: <lambda>() got an unexpected keyword argument 'axis'
答案 0 :(得分:1)
类似的东西:
def chunkify(chunk_size):
df['chunk'] = (df.index.values - 1) / chunk_size
df['E'] = df.groupby('chunk').apply(lambda x: x.B - pd.expanding_min(x.C)).values.flatten()