在Pandas/Numpy中,如何在每个块内使用两个不同列实现滚动函数?

4 投票
1 回答
890 浏览
提问于 2025-04-29 09:51

我有一个数据框(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)

我需要对每个小块应用上面的公式。所以我按照这个方法尝试了:

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'
暂无标签

1 个回答

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()

撰写回答