Python 复杂条件和

Python 复杂条件和,python,pandas,numpy,Python,Pandas,Numpy,我想问一个关于熊猫的问题,我想用一个小例子来解释这个问题是个好主意 我有 Group Price 0 102 0 103 0 105 1 106 0 105 0 106 1 103 0 105 我想要 Group Price Impact 0 102 0 103 0

我想问一个关于熊猫的问题,我想用一个小例子来解释这个问题是个好主意

我有

 Group     Price
 0         102
 0         103
 0         105
 1         106
 0         105
 0         106
 1         103
 0         105
我想要

 Group     Price   Impact
 0         102     
 0         103
 0         105
 1         106     -5    (103 - 108)
 0         104
 0         108
 1         101     -3    (104-107)
 0         107
所以,基本上,我想在我的组值等于1t时,找出前面的t-2和后面的t+2第二行之间的差异。例如,在第一种情况下,冲击值等于-5。这仅仅是因为我的组值是第4行t中的1,代码会找到第二行t-2和第六行t+2之间的差异。我可以使用以下代码执行此操作:

 i = Data.loc[Data.Group.eq(1)].index.tolist()
 j = [(i-2,i+2) for i_ in i ]
 Data.loc[Data.Group.eq(1), 'impact'] = 
 [(Data.Price.iloc[b] - Data.Price.iloc[a]) for (a,b) in j] 
但是,如果在任何行中都不满足该条件,则我得到以下错误:

 IndexError: single positional indexer is out-of-bounds
例如,让我们再看看我的have数据。如您所见,第8行价格=101时,Group的值等于1。虽然我在第6行t-2中有值,但我没有第10行t+2,因为数据有9行

如果数据不可用,我想开发使用最接近值的代码。例如,如我所说,在第8行中,Group的值等于1。通常,代码应该找到第6行和第10行之间的差异。但是,由于我没有第10排,我想找出第6排和第9排之间的区别

我希望我能解释一下

提前感谢您的帮助

在对“Price”列执行操作后,可以使用ffill和bfill来获取超出范围的缺失值。首先创建列“Group”为1的掩码。然后将“Price”中的值2和-2移位,填充移位操作生成的NaN并进行减法运算

#create the mask
mask = df.Group == 1
# create the column Impact
df.loc[mask,'Impact'] = (df.Price.shift(2).bfill() - df.Price.shift(-2).ffill())[mask] 
你得到了什么

print (df)
   Group  Price  Impact
0      0    102     NaN
1      0    103     NaN
2      0    105     NaN
3      1    106    -5.0
4      0    104     NaN
5      0    108     NaN
6      1    101    -3.0
7      0    107     NaN
可以使用fillna将Impact中的所有Nan值替换为所需的值

感谢添加注释的用户,您可以使用该方法在一行中完成此操作:

df['Impact'] = (df.Price.shift(2).bfill() - 
                      df.Price.shift(-2).ffill()).mask(df['Group'] != 1)

输出和输入数据帧中的价格是否发生了变化?df['Impact']=df.Price.shift2.bfill-df.Price.shift-2.ffill.maskdf['Group']!=1@ScottBoston谢谢,我不经常使用这种面膜方法