Python 如果对应(相同索引点)列B的条件成立,则将函数应用于列A

Python 如果对应(相同索引点)列B的条件成立,则将函数应用于列A,python,pandas,function,dataframe,boolean,Python,Pandas,Function,Dataframe,Boolean,我有一个数据框,在“关闭”列上有定价信息。我在“买入”和“卖出”列中有指标,它们是布尔值。我想对“close”列中的实例应用一个函数,当且仅当“BUY”的条件成立时,即当“BUY”==1时,对相应的“close”值应用一个函数(在给定时间段内返回)。我添加了一张图片,说明了我的意思,并显示了数据帧 谢谢 尝试: >>定义我的功能: ... 如果s['A']: ... s['B']=s['B']**2 ... 返回s ... >>>thing=pd.DataFr

我有一个数据框,在“关闭”列上有定价信息。我在“买入”和“卖出”列中有指标,它们是布尔值。我想对“close”列中的实例应用一个函数,当且仅当“BUY”的条件成立时,即当“BUY”==1时,对相应的“close”值应用一个函数(在给定时间段内返回)。我添加了一张图片,说明了我的意思,并显示了数据帧

谢谢

尝试:

>>定义我的功能:
...     如果s['A']:
...         s['B']=s['B']**2
...     返回s
... 
>>>thing=pd.DataFrame({'A':[True,False,True],'B':[1,2,3]})
>>>应用(my_func,axis=1)
A B
0对1
1假2
2对81
不过有一个警告:这比你想要的要慢得多。它消除了从矢量化计算中获得的所有速度,因为您的函数没有矢量化。如果您计划下一步要做的是精确地提取那些修改后的值(如
results=thing[thing['A']]['B']
),您应该将函数应用于该系列:

>>>东西[thing['A']['B']**2
0     1
2    81
名称:B,数据类型:int64

以下代码将获得您想要的回报:

import pandas as pd

data = pd.DataFrame({
        'Index':range(452, 464),
        'close':[113.05,112.05,111.45,114.20,109.45,110.50,109.65,114.4,110.15,110.90,112.25,117.75],
        'BUY':[1,1,0,0,0,0,0,0,0,0,0,0],
        'SELL':[0,0,0,0,0,0,0,0,0,0,0,0]
})

def calculate_buy_returns(data, n):
    returns = []
    for i, row in data.iterrows():
        if row.BUY == 1:
            if  (i + n) < len(data):
                # get the close price at index + n
                close_n = data[data.index == (i + n)].iloc[0].close
                returns.append((close_n - row.close)/row.close)
            else:
                returns.append(0)
        else:
            returns.append(0)
    return returns

data['returns'] = calculate_buy_returns(data, 10)

print(data)

为什么不把样本数据复制粘贴到这里?这有助于ppl更好地测试他们的答案。我将添加数据的尾部,其中包含一些条件。谢谢第462行需要sell=1,对吗?不。当SELL=1时,将为SELL列生成一个稍微不同的函数,但前提/规则与BUY列相同。您想要的函数需要基于最近的BUY=1工作吗?还是像你在例子中展示的第一个?i、 e.在计算回报时,是否应考虑第452行或第453行的买入?这是完美的。但我一直收到一个错误:“AttributeError:‘DataFrame’对象没有属性‘Index’”。你知道如何解决这个问题吗?检查你的数据框中是否有一个名为“Index”的显式列,就像你在截图中的示例中所示的那样?如果没有,则将用于设置close\n的行更改为:close\n=data[data.index==(i+n)].iloc[0]。close最后一件事。如果我将函数中的n更改为大于11的任何值,我将收到一个“IndexError:single positional indexer is out bounds”。如何解决这个问题,使n完全不明确且没有约束?您需要确保当前索引+n不大于数据帧中的行数。您可以使用len(data)找到数据帧的行数,并为其添加检查。是的,buy=1的最后一个实例是距离数据帧末尾12行。建议创建虚拟行以使其在适当的n范围内的实例中工作?
import pandas as pd

data = pd.DataFrame({
        'Index':range(452, 464),
        'close':[113.05,112.05,111.45,114.20,109.45,110.50,109.65,114.4,110.15,110.90,112.25,117.75],
        'BUY':[1,1,0,0,0,0,0,0,0,0,0,0],
        'SELL':[0,0,0,0,0,0,0,0,0,0,0,0]
})

def calculate_buy_returns(data, n):
    returns = []
    for i, row in data.iterrows():
        if row.BUY == 1:
            if  (i + n) < len(data):
                # get the close price at index + n
                close_n = data[data.index == (i + n)].iloc[0].close
                returns.append((close_n - row.close)/row.close)
            else:
                returns.append(0)
        else:
            returns.append(0)
    return returns

data['returns'] = calculate_buy_returns(data, 10)

print(data)
    Index   close  BUY  SELL   returns
0     452  113.05    1     0 -0.007077
1     453  112.05    1     0  0.050870
2     454  111.45    0     0  0.000000
3     455  114.20    0     0  0.000000
4     456  109.45    0     0  0.000000
5     457  110.50    0     0  0.000000
6     458  109.65    0     0  0.000000
7     459  114.40    0     0  0.000000
8     460  110.15    0     0  0.000000
9     461  110.90    0     0  0.000000
10    462  112.25    0     0  0.000000
11    463  117.75    0     0  0.000000