如何将函数应用于循环中的表的行

时间:2016-01-22 16:34:58

标签: python function loops pandas

我有一个简单的函数,它读入两个纬度,如果它们彼此靠近,它将返回“空闲”

def is_idle(lat1, lat2):

    if lat1 - lat2 < 0.1:
        return 'idle'
    elif lat1 - lat2 > 0.1:
        return 'active'
    else:
        return 'error'

我如何在循环中将它应用于python循环中的行对?

3 个答案:

答案 0 :(得分:1)

你的意思是这样吗?

def is_idle(lat1, lat2):

    if lat1 - lat2 < 0.1:
        return 'idle'
    elif lat1 - lat2 > 0.1:
        return 'active'
    else:
        return 'error'


lats = [1,2,3,4,5,6,7,8,9]

for i in range(len(lats)-1):
    lat1= lats[i]
    lat2 = lats[i+1]
    is_idle(lat1,lat2)

答案 1 :(得分:1)

另一个选择是使用map和lambda和zip而不是for循环:

lats = [1,2,3,4,5,6,7,8,9]
L = zip(lats[:-1], lats[1:]) # L = [(1,2),(2,3), ...]
map(lambda l: is_idle(l[0],l[1]), L)

map(lambda l: is_idle(*l), L)

答案 2 :(得分:1)

我意识到最初的问题是关于for循环,但我建议这是一个很好的例子,说明何时不使用for loop

这是我的解决方案:

def is_idle2(e):
    if e > 0.1:
        return 'idle'
    elif e < 0.1:
        return 'active'
    return 'error'

lats = pd.Series([5, 2, 1, 4, 5, 6]*100000)

(lats - lats.shift(1)).dropna().map(is_idle2)

时序:

#my solution
%timeit (lats - lats.shift(1)).dropna().map(is_idle2)
10 loops, best of 3: 185 ms per loop

#Currently accepted solution
%%timeit
for i in range(len(lats)-1):
    lat1= lats[i]
    lat2 = lats[i+1]
    is_idle(lat1,lat2)
1 loops, best of 3: 15.8 s per loop

在没有for循环的情况下执行此操作,在体积适中的系列上快了大约100倍。