[英]python - pass dataframe column as argument in apply function
我有以下數據框:
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'],))
在這種情況下,我將整個pandas數據系列作為參數傳遞,因此數據系列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
因為該函數循環遍歷pandas系列中的每個元素,然后遍歷列表中的每個元素。
如何獲得僅針對每個數據幀行,將系列df ['B']的元素與系列df ['A']的元素進行比較的函數,所以輸出為:?
Out[2]:
0 1
1 1
非常感謝!
你必須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系列。
您可以執行此操作的另一種方法是使用設置的相交來計算大小。 從理論上講,這比遍歷元素更快,因為set
是為這種事情而設計的:
df['C'] = df.apply(lambda x: len(set(x.B).intersection(set(x.A.split()))), axis = 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.