我想问一个关于 pandas 的问题,我认为用一个小例子来解释这个问题是个好主意。
我有
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
所以,基本上,一旦我的组值等于 1 (t),我想找到前面 (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
例如,让我们再看看我的数据。如您所见,第 8 (t) 行中的 Group 值等于 1(价格 = 101)。虽然我在第 6 行 (t-2) 中有值,但我没有第 10 (t+2) 行,因为数据有 9 行。
我想开发在数据不可用时使用最接近值的代码。例如,正如我所说,第 8 (t) 行中 Group 的值等于 1。通常,代码应该找到第 6 行和第 10 行之间的差异。但是,由于我没有第 10 行,所以我想找到第 6 行和第 9 行之间的差异。
希望我能解释一下。
预先感谢您的帮助!
最佳答案
执行 shift
后,您可以使用 ffill
和 bfill
在“价格”列上获取超出范围的缺失值。首先创建一个掩码,其中“Group”列为 1。然后将“Price”中的值shift
为 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谁添加了评论,可以使用方法mask
一行完成:
df['Impact'] = (df.Price.shift(2).bfill() -
df.Price.shift(-2).ffill()).mask(df['Group'] != 1)
关于python - 复杂条件和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55855034/