2014-09-19 22 views
7

Mam następujący DataFrame:Pandy odnośników na podstawie wartości

Date best a b c d 
1990 a  5 4 7 2 
1991 c  10 1 2 0 
1992 d  2 1 4 12 
1993 a  5 8 11 6 

Chciałbym wnieść dataframe następująco:

Date best value 
1990 a  5 
1991 c  2 
1992 d  12 
1993 a  5 

Więc szukam znaleźć wartość na podstawie innego wiersza wartość za pomocą nazw kolumn. Na przykład wartość dla 1990 w drugim df powinna wyglądać "a" od pierwszego df, a drugi wiersz powinien wyglądać "c" (= 2) od pierwszego df.

Wszelkie pomysły?

Odpowiedz

4

utworzyć funkcji wyszukiwania i zadzwonić apply na dataframe row-mądry, to nie jest bardzo skuteczny dla dużych DFS chociaż

In [245]: 

def lookup(x): 
    return x[x.best] 
df['value'] = df.apply(lambda row: lookup(row), axis=1) 
df 
Out[245]: 
    Date best a b c d value 
0 1990 a 5 4 7 2  5 
1 1991 c 10 1 2 0  2 
2 1992 d 2 1 4 12  12 
3 1993 a 5 8 11 6  5 
+0

Czy możesz wyjaśnić, jak działa ten kod? – 3kstc

+0

@ 3kstc w zasadzie używamy 'apply' do iterowania po wierszach, przekazując arg' axis = 1' więc lambda tutaj jest wierszem, więc dla pierwszego wiersza 'x' jest pierwszym wierszem, następnie zwracamy konkretną kolumnę, która w ten przypadek będzie wartością 'najlepszego' do indeksowania tego wiersza – EdChum

4

Jest to wbudowany w lookup funkcji, która może obsłużyć tego typu sytuacji (wyszukuje według wiersza/kolumny). Nie wiem, jak jest zoptymalizowany, ale może być szybszy od stosowanego rozwiązania.

In [9]: df['value'] = df.lookup(df.index, df['best']) 

In [10]: df 
Out[10]: 
    Date best a b c d value 
0 1990 a 5 4 7 2  5 
1 1991 c 10 1 2 0  2 
2 1992 d 2 1 4 12  12 
3 1993 a 5 8 11 6  5 
+1

Na zestawie danych zabawki stosuje się 470us, odnośnik ma 531us – EdChum

+1

Hmm z jakiegoś powodu timeit dostaje błąd pamięci, gdy próbuję tego na nawet skromnym rozmiarze df powiedzmy 4000 wierszy , dla 400 wierszy uzyskuję 8,17 ms przy użyciu polecenia apply i 3,05 ms przy użyciu odnośnika, więc spodziewam się, że wyszukiwanie będzie lepiej skalowane – EdChum

+0

Wyszukiwanie może być preferowane ze względu na prostszą składnię, ale obie działają idealnie, thx faceci! – AtotheSiv

Powiązane problemy