2013-05-03 70 views
119

aşağıdaki dataframePandalar: birden çok sütun

df = DataFrame ({'a' : np.random.randn(6), 
      'b' : ['foo', 'bar'] * 3, 
      'c' : np.random.randn(6)}) 

ve aşağıdaki fonksiyonu ile birden çok sütun kullanırken fonksiyonunu uygulamak Pandalar ile bazı sorunlar var işlevini uygulamak nasıl kullanılır

def my_test(a, b): 
    return a % b 

zaman Ben hata mesajı

df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1) 

: birlikte bu işlevi uygulamak için denemek

NameError: ("global name 'a' is not defined", u'occurred at index 0') 

Bu mesajı anlamıyorum, adı doğru şekilde tanımladım.

Ben bu konuda

Güncelleme Yardımlarınız için

Teşekkür üzerinde herhangi bir yardım takdir derece olur. Ben gerçekten kod ile bazı sözdizimi hataları yaptım, indeks '' koyulmalıdır.

def my_test(a): 
    cum_diff = 0 
    for ix in df.index(): 
     cum_diff = cum_diff + (a - df['a'][ix]) 
    return cum_diff 

teşekkür ederiz

+0

Büyük olasılıkla bundan uzun zaman önce bu konuya geçtiniz, ancak Güncelleştirmede tanımladığınız işlevin tanımlanmamış bir değişkene sahip olduğunu düşünüyorum: df. – rocarvaj

cevap

193

Dizenizin '' değerini unuttuğunuz görünüyor.

In [43]: df['Value'] = df.apply(lambda row: my_test(row['a'], row['c']), axis=1) 

In [44]: df 
Out[44]: 
        a b   c  Value 
      0 -1.674308 foo 0.343801 0.044698 
      1 -2.163236 bar -2.046438 -0.116798 
      2 -0.199115 foo -0.458050 -0.199115 
      3 0.918646 bar -0.007185 -0.001006 
      4 1.336830 foo 0.534292 0.268245 
      5 0.976844 bar -0.773630 -0.570417 

BTW, benim görüşüme göre, aşağıdaki şekilde daha zarif:

In [53]: def my_test2(row): 
....:  return row['a'] % row['c'] 
....:  

In [54]: df['Value'] = df.apply(my_test2, axis=1) 
+0

Teşekkürler, Haklısınız ''. Ancak hala daha karmaşık bir işlevle aynı sorunu yaşıyorum. Bununla ilgili yardımın için çok teşekkür ederim. Teşekkürler – Andy

+2

@Andy aşağıdaki [53-54] daha karmaşık işlevleri uygulamanıza izin verir. –

+0

@Gelişmiş fonksiyonunuzu [53] şeklinde tanımlayabilirsiniz. – waitingkuo

20

sadece hesaplamak istiyorsanız (sütun)% (sütun b) Eğer apply gerekmez: örneğin Ancak hala daha karmaşık bir fonksiyon da aynı sorun var Sadece doğrudan yapın:

In [7]: df['a'] % df['c']                                       
Out[7]: 
0 -1.132022                                          
1 -0.939493                                          
2 0.201931                                          
3 0.511374                                          
4 -0.694647                                          
5 -0.023486                                          
Name: a 
+7

Biliyorum, bu bir problemi birden çok sütun için uygulamada uyguladığımı gösteren bir örnektir. – Andy

6

en biz kolon'durumuna 'a' ve DataFrame df

arasında 'b' bir işlev add5 uygulamak istediğinizi varsayalım
def add5(x): 
    return x+5 

df[['a', 'b']].apply(add5) 
İlgili konular