复杂条件和

2024-05-28 22:51:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有

 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

所以,基本上,我想找出前面(t-2)和后面(t+2)第二行之间的差异,一旦我的组值等于1(t)。例如,在第一种情况下,冲击值等于-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(t)行中Group的值等于1(Price=101)。虽然我在第6行(t-2)中有值,但我没有第10行(t+2),因为数据有9行。你知道吗

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

我希望我能解释一下。你知道吗

提前感谢您的帮助!你知道吗


Tags: 数据代码infordatagroup差异price
1条回答
网友
1楼 · 发布于 2024-05-28 22:51:52

在对“Price”列执行^{}之后,可以使用ffillbfill来获取超出界限的缺失值。首先创建列“Group”为1的掩码。然后shift将'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值

感谢@Scott Boston添加了注释,您可以使用方法^{}在一行中完成:

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

相关问题 更多 >

    热门问题