如何提取位于当前位置下方两个单元格的 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
我有一个这样的 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