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谢谢,我不经常使用这种面膜方法