2015-10-19 16 views
7

2 argüman alan sayım adı verilen bir yöntem var. Apply() yöntemini kullanarak bu yöntemi çağırmam gerekir. Ancak aşağıdaki hatayı veriyor uygulamak yöntemine iki parametre geçirerek zaman: Aşağıdaki iplik python pandas: apply a function with arguments to a series. Update gördükUygulama işlevine birden çok bağımsız değişken nasıl uygulanır

TypeError: counting() takes exactly 2 arguments (1 given)

ve ben ithal etmek istemiyorum functool.partial kullanmak istemiyoruz parametreleri geçirebilmek için ek sınıflar. Tek bir parametre verirsek

def counting(dic, strWord): 
    if strWord in dic: 
     return dic[strWord] 
    else: 
     return 0 

DF['new_column'] = DF['dic_column'].apply(counting, 'word') 

, çalışır: Diğer taraftan

DF['new_column'] = DF['dic_column'].apply(lambda dic: counting(dic, 'word')) 

kesinlikle partial kullanarak yanlış bir şey vardır:

def awesome_count(dic): 
    if strWord in dic: 
     return dic[strWord] 
    else: 
     return 0 

DF['new_column'] = DF['dic_column'].apply(counting) 
+0

'dic' nedir ve nereden gelmesini bekliyorsunuz? Ayrıca, 'parsiyel' ile sorun nedir? Standart kütüphanenin bir parçası ... – tzaman

+0

İkinci argümanın nereden gelmesini istediniz? –

+0

Daha fazla açıklık için soruyu değiştirdi. dic, uygulama işleviyle varsayılan olarak gelecek olan sütun değeridir. İkinci argüman, mantık kullanılarak geçirilmekte olan yeni bir argümandır. – Bonson

cevap

12

Sadece bir lambda kullanabilirsiniz burada:

from functools import partial 
count_word = partial(counting, strWord='word') 
DF['new_column'] = DF['dic_column'].apply(count_word) 

@EdChum bahseder gibi sizin counting yöntem aslında sadece bir kelime ararken veya sıfır olarak varsaymak ise, sadece kullanışlı yerine kendinizi bir yazma dict.get yöntemi kullanabilirsiniz:

DF['new_column'] = DF['dic_column'].apply(lambda dic: dic.get('word', 0)) 

Ve olmayan lambda yolu operator modülü aracılığıyla, yukarıda yapmalı:

from operator import methodcaller 
count_word = methodcaller(get, 'word', 0) 
DF['new_column'] = DF['dic_column'].apply(count_word) 
+1

Bu bana gerekli çözümü veriyor. Teşekkür ederim. Daha önceki sorunuza göre, bu yöntemin kısmi kullanımdan daha iyi olacağını varsaymıştım. Doğru mu? Ayrıca, mümkünse, bu çözümü anlamış olduğumu teyit edin, burada sütun değeri, değişken bir dikeye geçirilir, bu da başka bir değişken değeri ile birlikte sayma yöntemine iletilir. – Bonson

+1

'kısmi 'burada eşdeğerdir, lambda herhangi bir şekilde' daha iyi 'değildir: ör. countWord = kısmi (sayma, strWord = 'word') 've sonra da (countWord)' uygulanır. Ve evet, anlayışınız doğru. – tzaman

+0

Bu durumda bence sadece 'DF [' new_column '] = DF [' dic_column '] .Uygulama (lambda x: dic.get (x, 0)) ' – EdChum

3

kabul cevabı tamamen mükemmeldir. Bana Python hakkında bazı ilginç şeyler öğretti. Ama sadece eğlence için, işte aradığımız şey şu: tam olarak ne arıyoruz:

selected_words = ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate'] 
for this_word in selected_words: 
    products[this_word] = products['word_count'].apply(lambda dic: dic.get(this_word, 0)) 

Soruyu gönderdiğiniz için teşekkür ederiz!

+0

Bu tam olarak aradığım şey. Teşekkürler –

+0

Bunun neden işe yaradığını bilmek isterim ¿sadece kapsam belirleme meselesidir? –

İlgili konular