Python 在Pandas/Numpy中,如何使用两个不同的列在每个块中实现滚动功能?
我有一个df,它被块“划分”,如下所示: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
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。