2014-09-19 17 views
7

dayalı Aşağıdaki DataFrame vardır: Pandalar arama değeri

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

Bu yüzden başka bir satırda dayalı bir değeri bulmak için arıyorum şu şekildedir: Ben istiyorum
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 

bir dataframe yapmak sütun isimlerini kullanarak değer. Örneğin, ikinci df'de 1990 için değer, ilk df'den "a" aramalı ve ikinci satırın ilk df'den "c" (= 2) aranması gerekir.

Herhangi bir fikrin var mı?

cevap

4

Bir arama fonksiyonunu oluşturmak ve dataframe sıra sıra üzerinde apply diyoruz, bu durumun bu tip işleyebilir bir lookup işlevinde Orada inşa edilmiştir

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

Bu kodun nasıl çalıştığını açıklamak için herhangi bir şansınız var mı? – 3kstc

+0

@ 3kstc temel olarak 'apply' komutunu arg' axis = 1 'parametresini vererek satırlar üzerinde yinelemek için kullanırız, böylece lambda burada satır ilk satır 'x' için ilk satırdır, daha sonra belirli bir sütunu döndürürüz. Bu durum, – EdChum

4

olsa büyük DFS için çok verimli değildir (satır/sütuna göre bakar). Nasıl optimize edildiğini bilmiyorum, ancak çözümden daha hızlı olabilir.

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

satırını dizine eklemek için en iyi değere sahip olacaktır. Oyuncak veri kümesi uygulamasında 470us, arama işlemi 531us – EdChum

+1

Hmm alır. Bu nedenle, zaman çizelgesi, 4000 satırlık bir mütevazı boyutta df denerken bir bellek hatası alır , 400 satır için 8.17ms'i kullanarak başvurumu kullanarak ve 3.05ms'i kullanarak aramaları daha iyi yapabilirim. Bu yüzden daha iyi ölçeklenmeyi bekliyorum – EdChum

+0

Daha basit bir sözdizimi nedeniyle arama tercih edilebilir, ancak her ikisi de mükemmel çalışıyor, çocuklar! – AtotheSiv