python - 复杂条件和

标签 python pandas numpy

我想问一个关于 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 后,您可以使用 ffillbfill在“价格”列上获取超出范围的缺失值。首先创建一个掩码,其中“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/

相关文章:

python - 使用 json 模块解码类似 JSON 的对象

python - PyQt:自定义属性的 QDataWidgetMapper 映射

python - 如果数据存储在 numpy 数组中,如何取大于某个数的所有值的中位数?

python - Pandas 按大于 N 分钟的时间增量进行分组

python - 内存不足过滤 Pandas 中的 HDF5 表

python - 将交易转换为 numpy 数组

python - 基于数组的 Numpy 3d 数组赋值

python - Pandas 中带有子范围的 GroupBy

python - BrainTree Scientific, Inc. 注入(inject)泵(型号 bs-8000)rs232 的串行命令

python - 字典在传递给函数时显示为 None