我有一個這樣的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 之間的每個單元格,我需要將低于該值的兩個單元格的值存盤到變數“標記”中。
我試過了:
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
我很想聽聽有關解決此問題的建議。
uj5u.com熱心網友回復:
我們可以使用Series.between和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
uj5u.com熱心網友回復:
問題是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
uj5u.com熱心網友回復:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/433577.html
標籤:Python python-3.x 熊猫 数据框 python-2.7
上一篇:lapply串列中資料框中的列名
