Python pandas-使用自定义函数在dataframe的所有列上滚动窗口,并传递额外参数
我有一个熊猫数据框,有7列,大约1000000行Python pandas-使用自定义函数在dataframe的所有列上滚动窗口,并传递额外参数,python,pandas,Python,Pandas,我有一个熊猫数据框,有7列,大约1000000行 column1 column2 column3 column4 column5 column6 column7 0 0 0.361690 0.377105 0.361405 0.374822 0.001909 0.368755 1 1 0.367399 0.376820 0.338567 0.356552 0.068900 0.359834 2
column1 column2 column3 column4 column5 column6 column7
0 0 0.361690 0.377105 0.361405 0.374822 0.001909 0.368755
1 1 0.367399 0.376820 0.338567 0.356552 0.068900 0.359834
2 2 0.357122 0.390237 0.353982 0.359121 0.036614 0.365116
3 3 0.364545 0.405652 0.360263 0.387953 0.070556 0.379603
这是一个非常简单的自定义函数示例(用于演示),我只能在一列上使用
def customFunction(df):
if (df.mean() >= 0.5):
result = True
else:
result = False
return result
dataFrame["column8"] = dataFrame["column2"].rolling(window=2000).apply(customFunction)
是否有一种有效的方法可以在dataframe的所有列上滚动一个窗口(一定大小),并传递一些其他参数。像这样的
def customRollingFunctionWithMultipleColumns(dataFrame1, dataFrame2):
dataFrame1 = functionToNormalizeData(dataFrame1)
dataFrame1["column8"] = dataFrame2["compareAgainst"]
dataFrame1["column9"] = np.where(((dataFrame1['column8'] <= dataFrame1['column2']) & (dataFrame1['column8'] >= dataFrame1['column3'])), 1, 0)
result = dataFrame1.column9.sum()
return result
dataFrame["column8"] = dataFrame.rolling(window=2000).apply(customRollingFunctionWithMultipleColumns(dataFrameWith2000Rows, dataFrame2))
def具有多列(dataFrame1、dataFrame2)的自定义滚动功能:
dataFrame1=函数格式化数据(dataFrame1)
dataFrame1[“column8”]=dataFrame2[“CompareAinst”]
dataFrame1[“column9”]=np.其中(((dataFrame1['column8']=dataFrame1['column3'])),1,0)
结果=dataFrame1.column9.sum()
返回结果
dataFrame[“column8”]=dataFrame.rolling(窗口=2000).apply(具有多个列的自定义rolling函数(DataFrameWith2000行,dataFrame2))
IIUC您可以这样做:
def customRollingFunctionWithMultipleColumns(df1, df2):
qry = "column2 <= @df2.compareAgainst and @df2.compareAgainst <= column3"
return (df.eval(qry)*1).sum()
df2 = pd.DataFrame({'compareAgainst':(df.column3 + df.column2)/2})
df2.loc[[0,3]] *= 2
In [84]: df.rolling(window=2).apply(lambda x: customRollingFunctionWithMultipleColumns(x, df2))
Out[84]:
column1 column2 column3 column4 column5 column6 column7
0 NaN NaN NaN NaN NaN NaN NaN
1 2.0 2.0 2.0 2.0 2.0 2.0 2.0
2 2.0 2.0 2.0 2.0 2.0 2.0 2.0
3 2.0 2.0 2.0 2.0 2.0 2.0 2.0
具有多列(df1、df2)的def自定义滚动功能:
qry=“第二栏你的问题有点太笼统了。答案将取决于您希望在具有多个列的
自定义滚动功能中执行的操作。你能提供更多细节吗?hei@MaxU我刚刚编辑了CustomRolling函数和MultipleColumns函数,其中包含了实际发生的更多细节。你有什么建议吗?现在好多了-让我试着找到一个合适的解决方案让我尽可能地重新定义这个问题:如何在所有列上滚动一个2000行的窗口,并将该窗口作为数据帧传递给另一个函数,在该函数中发生一些逻辑,然后返回结果并将其保存在同一行下的新列中原始数据帧@MaxUI添加了一个简单的解决方案,它使用lambda
函数。请注意使用多列重写的CustomRollingFunction
函数-它的功能几乎与您的相同,但比较起来(第2列谢谢,这正是我想要的结果:)@RaduS,很高兴我能帮上忙:-)