簡體   English   中英

python-將dataframe列作為apply函數中的參數傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM