如何从Series中获取指定值前面的值

时间:2016-12-17 03:15:39

标签: pandas

xSeries = pd.Series([1,200,5,13,3,301],index=['b', 's', 'h', 'd', 'e','a'])

当我获得值13时,我想在值13之前得到值200.我该如何编写代码?

2 个答案:

答案 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)