2015-11-02 46 views
0

我有以下數據框:蟒蛇 - 通過數據幀列作爲參數的應用功能

In[1]: df = DataFrame({"A": ['I love cooking','I love rowing'], "B": [['cooking','rowing'],['cooking','rowing']]}) 

因此我得到的輸出是:

In[2]: df 
Out[1]: 
      A     B 
0 I love cooking [cooking, rowing] 
1 I love rowing [cooking, rowing] 

我想創建一個「C」柱我計算'A'中'B'元素的出現次數。

創建功能是:

def count_keywords(x,y): 
    a = 0 
    for element in y: 
     if element in x: 
      a += 1 
return a 

然後執行:

df['A'].apply(count_keywords,args=(df['B'],)) 

在這種情況下,我傳遞整個大熊貓dataseries作爲參數,所以dataseries DF的元素[ 'B']顯然是一個列表,而不是一個字符串(這又是列表的元素)。

所以我得到:

TypeError: 'in <string>' requires string as left operand, not list 

但是,如果我調整功能,使:

def count_keywords(x,y): 
    a = 0 
    for element in y: 
     for new_element in element: 
      if new_element in x: 
       a += 1 
    return a 

然後執行:

In[3]: df['A'].apply(count_keywords,args=(df['B'],)) 

輸出爲:

Out[2]: 
0 2 
1 2 

因爲函數循環遍歷熊貓系列中的每個元素,然後遍歷列表中的每個元素。

我該如何獲得函數來檢查每個數據幀行,對系列df ['A']中的元素進行系列df ['B']的元素檢查,因此輸出結果爲:?

Out[2]: 
0 1 
1 1 

非常感謝!

回答

2

另一種方法,你可以做到這一點是通過使用設置交集來計算大小。在理論上,這可能會更快然後遍歷元素,因爲set是那種專爲這種事情:

df['C'] = df.apply(lambda x: len(set(x.B).intersection(set(x.A.split()))), axis = 1) 
2

您必須在另一個軸上使用apply

def count_keywords(row): 
    counter = 0 
    for e in row['B']: 
     if e in row['A']: 
      counter += 1 
    row['C'] = counter 
    return row 

df2 = df.apply(count_keywords,axis=1) 

爲您提供:

  A    B   C 
0 I love cooking [cooking, rowing] 1 
1 I love rowing [cooking, rowing] 1 

然後DF2 [ 'C']應該給你1,1系列你提到。

+0

大忠告VMG的,我看到你傳遞的行而不是列。很有意義。 –