我創建了一個函式來根據下表每個單元格中的值給出排名:表名是“排名”
Date MMM AOS ABT
2016-01-31 55.0 411.0 102.0
2016-02-29 44.0 425.0 96.0
2016-03-31 29.0 410.0 70.0
2016-04-30 29.0 425.0 87.0
2016-05-31 46.0 409.0 52.0
功能:
def get_rank(x):
if 1 <= x < 96:
return 1
elif 96 <= x < 193:
return 2
elif 193 <= x < 289:
return 3
elif 289 <= x <= 385:
return 4
elif x > 385:
return 5
我嘗試使用 lambda 應用該函式:
ranked.apply(lambda x: get_rank(x))
但是它給了我錯誤訊息:
The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
最終目標是為表中所有低于 96 的值設定 1,為所有高于 192 且小于 289 的值設定 2 .... 以此類推,直到 5。
您能否給我一個提示,我如何可以輕松地將這個功能應用于表格?感謝你的幫助!
uj5u.com熱心網友回復:
改用applymap:
>>> ranked[['MMM','AOS','ABT']].applymap(get_rank)
get_rank()應回傳將您的函式應用于每個值而產生的子資料幀“MMM、AOS、ABT” 。
uj5u.com熱心網友回復:
我只是將排名列添加到資料框中:
df['Ranked MMM']=[get_rank(i) for i in df['MMM']]
并且還在函式末尾添加一個默認回傳,例如 return 0
uj5u.com熱心網友回復:
您可以使用它.applymap來執行此操作。您不必將函式包裝在 a 中,lambda因為它已經將單個值作為引數。由于嘗試在日期上應用函式會導致錯誤,因此您必須指定要映射的列,然后替換原始值。
apply_on = ["MMM", "AOS", "ABT"]
ranked[apply_on] = ranked[apply_on].applymap(get_rank)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/426989.html
