Python df循环和应用';pct#U变更';函数到特定行--AttributeError:';浮动';对象没有属性';pct#U变更';

Python df循环和应用';pct#U变更';函数到特定行--AttributeError:';浮动';对象没有属性';pct#U变更';,python,pandas,numpy,pandas-groupby,Python,Pandas,Numpy,Pandas Groupby,这是我的第一个问题,我对编码(3mo)还不熟悉。如果我不能很好地解释我自己,请直截了当 我正在处理一个大型的股票期权df,希望遍历每一行,并将'pct_change()'函数应用于'optionalas'==前一行'optionalas'的行。我已经做了一个单独的列标记为“匹配”,以确定这是真的 index, optionalias, quotedate, last, match, percent_change 0 SPY200103P00260000 2020-01-03 0.01

这是我的第一个问题,我对编码(3mo)还不熟悉。如果我不能很好地解释我自己,请直截了当

我正在处理一个大型的股票期权df,希望遍历每一行,并将'pct_change()'函数应用于'optionalas'==前一行'optionalas'的行。我已经做了一个单独的列标记为“匹配”,以确定这是真的

index, optionalias, quotedate, last, match, percent_change
0   SPY200103P00260000  2020-01-03  0.01    False   0
1   SPY200103P00265000  2020-01-02  0.01    False   0
2   SPY200103P00265000  2020-01-03  0.01    True    0
3   SPY200103P00270000  2020-01-02  0.01    False   0
4   SPY200103P00272500  2020-01-02  0.01    False   0
5   SPY200103P00272500  2020-01-03  0.01    True    0
6   SPY200103P00275000  2020-01-02  0.01    False   0
put\u选项\u df\u图像:

“pct_change()”函数将针对每个唯一的“optionaas”而不是整个数据集进行计算

我试图创建一个for循环,将'pct_change()'函数应用于'match'列==True的行,但我收到以下错误,即使列'last'是float64数据类型

for i, row in puts_grouped.iterrows():
    return_val = 0
    if row['match'] == True:
        return_val = row['last'].pct_change() * 100
    row.set_value(i,'percent_change', return_val)
AttributeError:“float”对象没有属性“pct\u change” 属性错误图像:

我尝试过的备选方案:

  • 我没有创建for循环,而是尝试使用groupby().pct_change(),但它产生了一个奇怪的输出
Groupby.Pct\u变化:

  • 一个不同的for循环要么卡住,要么永远运行
  • 然而,另一个没有成功的for循环:
对于我尝试过的任何方法,如果有任何指导,我将不胜感激。谢谢大家。

pct_change()函数适用于数据帧,但您将其应用于浮点对象。 您可以做的可能是创建另一个数据帧,其中所有行都是match=True by

puts_grouped1 = puts_grouped[(puts_grouped['match'] == True)]
然后将pct_change()应用于该组1

puts_grouped1['last'].pct_change()

请记住,pct_change()计算当前元素和先前元素的百分比变化,因此您将获得的第一个输出将始终为NaN

如果您的日期按升序排序,则您不需要组内的日期列:
df_historical_put.groupby(“optionalas”)['last']。pct_change()
应该可以工作
for i in puts_grouped['match']:
    
    put_option_returns = []
    
    if i == True:
        returns = puts_grouped['last'].pct_change() * 100
        put_option_returns.append(returns)
    else:
        returns = 0
        put_option_returns.append(returns)
puts_grouped1 = puts_grouped[(puts_grouped['match'] == True)]
puts_grouped1['last'].pct_change()