Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pandas-使用自定义函数在dataframe的所有列上滚动窗口,并传递额外参数_Python_Pandas - Fatal编程技术网

Python pandas-使用自定义函数在dataframe的所有列上滚动窗口,并传递额外参数

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

我有一个熊猫数据框,有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        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,很高兴我能帮上忙:-)