2017-08-15 42 views
2

基本上下面的代碼返回另一個字符串(在本例中爲'} JKLMNOPQR')的列'a'中字符的位置。在這個例子中,列'b'在所有行中具有相同的值,但它可以具有不同的值。在熊貓中找到另一列值的位置的矢量化方法

有沒有矢量化的方式來做到這一點?

frame = pd.DataFrame({'a' : ['L', '}', 'P']}) 
frame['b']='}JKLMNOPQR' 
frame['c'] = frame.apply(lambda row: row.b.find(row.a), axis=1) 
frame 

    a  b   c 
0 L }JKLMNOPQR 3 
1 } }JKLMNOPQR 0 
2 P }JKLMNOPQR 7 

回答

3

不向量化,但使用zip一個更快的解決方案:

lframe1 = pd.concat([frame]*1000) 
lframe2 = pd.concat([frame]*1000) 

%timeit lframe1['c'] = lframe1.apply(lambda row: row.b.find(row.a), axis=1) 
# 10 loops, best of 3: 77.7 ms per loop 

%timeit lframe2['c'] = [b.find(a) for a, b in zip(lframe2.a, lframe2.b)] 
# 1000 loops, best of 3: 1.4 ms per loop 

lframe1.c.eq(lframe2.c).all() 
# True 
2

您可以使用findnp.core.defchararray

np.core.defchararray.find(frame.b.values.astype(str), frame.a) 

array([3, 0, 7]) 

總結本了assign

frame.assign(c=np.core.defchararray.find(frame.b.values.astype(str), frame.a)) 

    a   b c 
0 L }JKLMNOPQR 3 
1 } }JKLMNOPQR 0 
2 P }JKLMNOPQR 7 

定時
很難被擊敗@ Psidom的zip
下面的代碼

enter image description here

pir1 = lambda d: d.assign(c=np.core.defchararray.find(d.b.values.astype(str), d.a.values.astype(str))) 
pir2 = lambda d: d.assign(c=(np.array([list(x) for x in d.b.values.tolist()]) == d.a.values[:, None]).argmax(1)) 
psi = lambda d: d.assign(c=[b.find(a) for a, b in zip(d.a, d.b)]) 
jso = lambda d: d.assign(c=d.apply(lambda row: row.b.find(row.a), axis=1)) 

results = pd.DataFrame(
    index=pd.Index([10, 30, 100, 300, 1000, 3000, 10000, 30000]), 
    columns='pir1 pir2 psi jso'.split() 
) 

for i in results.index: 
    d = pd.concat([frame] * i, ignore_index=True) 
    for j in results.columns: 
     stmt = '{}(d)'.format(j) 
     setp = 'from __main__ import d, {}'.format(j) 
     results.set_value(i, j, timeit(stmt, setp, number=10)) 

results.plot(loglog=True) 
相關問題