3 ответов:
In [9]: Series(df.Letter.values,index=df.Position).to_dict() Out[9]: {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}сравнение скорости (используя метод Ваутера)
In [6]: df = DataFrame(randint(0,10,10000).reshape(5000,2),columns=list('AB')) In [7]: %timeit dict(zip(df.A,df.B)) 1000 loops, best of 3: 1.27 ms per loop In [8]: %timeit Series(df.A.values,index=df.B).to_dict() 1000 loops, best of 3: 987 us per loop
Я нашел более быстрый способ решить проблему, по крайней мере, на реально больших наборов данных с использованием:
df.set_index(KEY).to_dict()[VALUE]доказательство на 50 000 строк:
df = pd.DataFrame(np.random.randint(32, 120, 100000).reshape(50000,2),columns=list('AB')) df['A'] = df['A'].apply(chr) %timeit dict(zip(df.A,df.B)) %timeit pd.Series(df.A.values,index=df.B).to_dict() %timeit df.set_index('A').to_dict()['B']выход:
100 loops, best of 3: 7.04 ms per loop # WouterOvermeire 100 loops, best of 3: 9.83 ms per loop # Jeff 100 loops, best of 3: 4.28 ms per loop # Kikohs (me)
в Python 3.6 самый быстрый способ по-прежнему является WouterOvermeire. Предложение кикохса медленнее, чем два других варианта.
import timeit setup = ''' import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(32, 120, 100000).reshape(50000,2),columns=list('AB')) df['A'] = df['A'].apply(chr) ''' timeit.Timer('dict(zip(df.A,df.B))', setup=setup).repeat(7,500) timeit.Timer('pd.Series(df.A.values,index=df.B).to_dict()', setup=setup).repeat(7,500) timeit.Timer('df.set_index("A").to_dict()["B"]', setup=setup).repeat(7,500)результаты:
1.1214002349999777 s # WouterOvermeire 1.1922008498571748 s # Jeff 1.7034366211428602 s # Kikohs
Comments