2013-05-03 14 views
119

Mam pewne problemy z Pand funkcji, stosuje się podczas korzystania z wielu kolumn z następującym dataframePandy: Jak korzystać z zastosowania funkcji do wielu kolumn

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

i następującej funkcji

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

Kiedy Próbuję zastosować tę funkcję z:

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

Otrzymuję komunikat o błędzie:

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

Nie rozumiem tej wiadomości, prawidłowo zdefiniowałem nazwę.

Gorąco wdzięczni za każdą pomoc w tej sprawie

aktualizacji

Dzięki za pomoc. Wprowadziłem kilka błędów składniowych wraz z kodem, należy umieścić indeks "". Jednak nadal mam ten sam problem przy użyciu bardziej złożonych funkcji, takich jak:

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

Dziękuję

+0

Prawdopodobnie przeniosłeś się z tego dawno temu, ale myślę, że funkcja zdefiniowana w aktualizacji ma niezdefiniowaną zmienną: df. – rocarvaj

Odpowiedz

193

Wydaje zapomniałeś '' swojego łańcucha.

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, moim zdaniem, po sposób jest bardziej elegancki:

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

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

Dzięki, masz rację, że zapomniałem ". Jednak nadal mam ten sam problem z bardziej złożoną funkcją. Byłbym bardzo wdzięczny za twoją pomoc. Dzięki – Andy

+2

@Andy po [53-54] pozwalają na stosowanie bardziej złożonych funkcji. –

+0

@Andy możesz zdefiniować swoje złożone funkcje, takie jak In [53]. – waitingkuo

20

Jeśli chcesz po prostu obliczyć (kolumna A)% (kolumna B), nie trzeba apply , po prostu to zrobić bezpośrednio:

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

Wiem, to tylko przykład, aby pokazać mój problem w zastosowaniu funkcji do wielu kolumn – Andy

6

Powiedzmy, że chcesz zastosować funkcję add5 do kolumn 'a' i 'b' DataFrame df

def add5(x): 
    return x+5 

df[['a', 'b']].apply(add5) 
Powiązane problemy