2013-07-02 13 views

Odpowiedz

45
In [9]: Series(df.Letter.values,index=df.Position).to_dict() 
Out[9]: {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'} 

Prędkość comparion (stosując metodę Wouter za)

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 
+0

Czy rozumiem to poprawnie, że twój plik df jest taki sam jak moje dane (pierwsze dwie komendy to po prostu wprowadzanie danych tak, jak ja to mam)? Jeśli nie, to dlaczego wprowadzasz wartości danych jako ciąg ręcznie? – user1083734

+0

tak, są takie same, po prostu kopiuję i wklejałem twoje dane (ten krok jest konieczny tylko dla odtwarzalności) – Jeff

+4

Bez tworzenia pierwszej serii ... dict (zip (df.Position, df.Letter)) –

14

znalazłem szybszy sposób, aby rozwiązać problem, przynajmniej na realistycznie dużych zestawów danych przy użyciu: df.set_index(KEY).to_dict()[VALUE]

Dowód na 50.000 wierszy:

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'] 

Wyjście:

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) 
+2

Zawsze przewijaj w dół dla możliwe szybsze odpowiedzi! –

Powiązane problemy