xSeries = pd.Series([1,200,5,13,3,301],index=['b', 's', 'h', 'd', 'e','a'])
当我获得值13时,我想在值13之前得到值200.我该如何编写代码?
答案 0 :(得分:0)
如果我理解正确,您需要在已知值之前查找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
答案 1 :(得分:0)
我所知道的最快的方法是降低到numpy并让它本地进行搜索:
import numpy as np
xSeries[np.argwhere(xSeries.values==v).reshape(-1)[0]-1]
返回xSeries的所有唯一值v
的正确值。当搜索结束时,之前的值1将为301。
如果您搜索的值不在列表中,这将提高IndexError
,这或多或少是合适的。
价值搜索没有明确定义;如果您有多个值的实例,则此搜索无法分辨您的意思。它总能找到第一个实例。但是由于numpy,它速度非常快。在您的小系列中大约50μsec,比我见过的最快的纯Pandas解决方案快约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)