如何提取位于当前位置下方两个单元格的 pandas 数据框单元格的值?

How to extract the value of a pandas dataframe cell, located two cells below the current position?

我有一个这样的 df:

df = pd.DataFrame([[1, 184], [1, 3], [4, 6], [2,183], [7,9], [0,7]], columns=['A', 'B'])
df

    A   B
0   1   184
1   1   3
2   4   6
3   2   183
4   7   9
5   0   7

我需要遍历 'B' 列,对于值介于 182 和 186 之间的每个单元格,我需要将其下方两个单元格的值存储到变量 'marker'。

我试过了:

for val in df['B']:
    if 182 < int(val) < 186:
        print(val)        
        marker = df['B'].shift(-2).values[0]
        print(marker)

我得到:

184
6.0
183
6.0

但我需要:

184
6.0
183
7.0

我很想听听解决此问题的建议。

我们可以使用 Series.between and Series.shift

s = df['B'].between(182, 186, inclusive="neither")
df.loc[s | s.shift(2), 'B']

输出

0    184
2      6
3    183
5      7
Name: B, dtype: int64

问题是 marker = df['B'].shift(-2).values[0] 总是只取移位列中的最高值,而不是与迭代相关的值。

如果您想保留循环方法,您可以压缩值并同时迭代它们

for val,marker in zip(df['B'], df['B'].shift(-2)):
    if 182 < int(val) < 186:
        print(val)
        print(marker)

184
6.0
183
7.0
vals = df.loc[df.B.isin(range(112,187)), 'B'].rename('val')
markers = df.loc[[i+2 for i in vals.index], 'B'].rename('marker')

out = pd.concat([vals.reset_index(drop=True), markers.reset_index(drop=True)], axis=1)

输出

   val  marker
0  184       6
1  183       7