xSeries = pd.Series([1,200,5,13,3,301],index=['b', 's', 'h', 'd', 'e','a'])
當我給出值13時,我想在值13之前獲得值200.如何編寫代碼?如何從系列中獲取指定值前面的值
xSeries = pd.Series([1,200,5,13,3,301],index=['b', 's', 'h', 'd', 'e','a'])
當我給出值13時,我想在值13之前獲得值200.如何編寫代碼?如何從系列中獲取指定值前面的值
如果我的理解正確,那麼您在查找已知值之前的值爲2行。在這種情況下,已知值爲13
v = 13
xSeries = pd.Series([1,200,5,13,3,301],index=['b', 's', 'h', 'd', 'e','a'])
print(xSeries)
b 1
s 200
h 5
d 13
e 3
a 301
dtype: int64
idx = xSeries[xSeries == v].index
print(idx)
Index(['d'], dtype='object')
a = xSeries.index.get_loc(idx[0])
print(a)
3
print(xSeries.iloc[[a - 2]])
s 200
dtype: int64
我知道的最快方法是下降到numpy的,讓它做本地搜索:
import numpy as np
xSeries[np.argwhere(xSeries.values==v).reshape(-1)[0]-1]
,對於所有返回正確的值xSeries的唯一值v
。搜索周而復始,以前的值1將爲301。 如果您搜索的值不在列表中,則這會增加IndexError
,這或多或少是合適的。
值搜索沒有明確定義;如果您有多個實例的值,則此搜索無法確定您的意思。它總是會找到第一個例子。但多虧了numpy,它非常快。在你的小系列中約50μsec,比我見過的最快的純熊貓解決方案快大約15倍。
下面是一個清理版本,它還說明了如何爲第一個元素設置邊界情況,以便搜索不會環繞(如果不希望它)。
def prev_value(series, v):
posn = np.argwhere(series.values==v).reshape(-1)[0]-1
if posn >= 0:
return series[posn]
return None
你會調用它的東西,如:
prev_value(xSeries, 200)
@inaMinute請考慮了投票的答案是都對您有幫助,和/或標記其中一個爲「最佳答案」(通過點擊答案左上角的複選標記)。 –