我有一个由块“划分”的 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'

最佳答案

像这样:

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

关于python - 在 Pandas/Numpy 中,如何使用 2 个不同的列在每个块内实现滚动功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26541059/

10-10 09:44