Python 在Pandas/Numpy中,如何使用两个不同的列在每个块中实现滚动功能?

Python 在Pandas/Numpy中,如何使用两个不同的列在每个块中实现滚动功能?,python,numpy,pandas,grouping,dataframe,Python,Numpy,Pandas,Grouping,Dataframe,我有一个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,]) def chunkify(chunk_size): df['chunk'] = (df.inde

我有一个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,])
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()
在本例中,块大小为3,我们有2个块(由列“D”中的元素1表示)。我需要在每个块中执行一个滚动计算,它涉及两列。具体来说,我需要在函数中创建一列“E”,该列等于列“B”减去列“C”的滚动最小值:

def retracement(x):
    return x['B'] - pd.rolling_min(x['C'], window=3)
我需要为每个区块应用上面的公式。所以我试着:

输出如下所示:

   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'
TypeError:()获得意外的关键字参数“axis”
类似这样的内容:

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

您只需要添加参数axis=1:apply(lambda行:func(行),axis=1)`然后,无论您的func做什么,都可以访问感兴趣的列:
def func(x):返回x['A']+x['C']
example@EdChum我遵循了你的建议,仍然停留在那里。我认为发生的事情是apply()的结果是具有2行3列的数据帧,而不是具有6个元素的系列。尝试将
.values.flant()
添加到命令末尾。我不知道这是否给了你想要的。。。您的滚动最小值没有给出您在所需输出中指定的数字(可能您只是希望该函数中的最小值())@Ajean您提出的解决方案给出了我想要的,但仅针对每个块的最后一个元素。不是在滚动的基础上。因为剩下的都是NaN。