我有一個這樣的資料框
ntil ureach_x ureach_y awgt
0 1 1 34 2204.25
1 2 35 42 1700.25
2 3 43 48 898.75
3 4 49 53 160.25
和這樣的值陣列
ulist = [41,57]
對于串列 [41,57] 中的每個值,我試圖找出這些值是否介于 ureach_x 和 ureach_y 之間并回傳 awgt 值。
awt=[]
for u in ulist:
for index,rows in df.iterrows():
if (u >= rows['ureach_x'] and u <= rows['ureach_y']):
awt.append(rows['awgt'])
上述代碼適用于 ureach_x 和 ureach_y 的取值范圍。如何檢查串列中的值是否大于 ureach_y 的最后一行。我的資料框具有動態形狀,行數不同。
例如,57串列中值的期望輸出是160.25
我嘗試了以下方法:
for u in ulist:
for index,rows in df.iterrows():
if (u >= rows['ureach_x'] and u <= rows['ureach_y']):
awt.append(rows['awgt'])
elif (u >= rows['ureach_x'] and u > rows['ureach_y']):
awt.append(rows['awgt'])
但是,這會回傳串列中 41 的多個值。如何在 iterrows 回圈中僅參考reach_y 列中的最后一個值。
預期輸出如下:
對于串列中的值:
[41,57]
必須回傳來自 df 的相應值。
[1700.25 ,160.25]
uj5u.com熱心網友回復:
如果我理解正確,您可以執行merge_asof:
s = pd.Series([41,57], name='index')
(pd.merge_asof(s, df, left_on='index', right_on='ureach_x')
.set_index('index')['awgt']
)
輸出:
index
41 1700.25
57 160.25
Name: awgt, dtype: float64
uj5u.com熱心網友回復:
如果資料中有 0 并且希望回傳 2204.25,則可以在 @mozway 的代碼中添加兩行并執行merge_asof兩次,一次向后,一次向前;然后將兩者結合起來。
ulist = [0, 41, 57]
srs = pd.Series(ulist, name='num')
backward = pd.merge_asof(srs, df, left_on='num', right_on='ureach_x')
forward = pd.merge_asof(srs, df, left_on='num', right_on='ureach_x', direction='forward')
out = backward.combine_first(forward)['awgt']
輸出:
0 2204.25
1 1700.25
2 160.25
Name: awgt, dtype: float64
另一種選擇(顯式回圈ulist):
out = []
for num in ulist:
if ((df['ureach_x'] <= num) & (num <= df['ureach_y'])).any():
x = df.loc[(df['ureach_x'] <= num) & (num <= df['ureach_y']), 'awgt'].iloc[-1]
elif (df['ureach_x'] > num).any():
x = df.loc[df['ureach_x'] > num, 'awgt'].iloc[0]
else:
x = df.loc[df['ureach_y'] < num, 'awgt'].iloc[-1]
out.append(x)
輸出:
[2204.25, 1700.25, 160.25]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/412118.html
標籤:
上一篇:基于特定組連接列
下一篇:如何強制asyncio任務運行?
