python在apply函数中将dataframe列作为参数传递

2024-09-29 02:17:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧:

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

因此,我得到的输出是:

^{pr2}$

我想创建一个“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数据系列作为参数传递,因此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

因为函数循环遍历pandas系列中的每个元素,然后遍历列表中的每个元素。在

我怎样才能让函数在每个dataframe行中只检查序列df['B']的元素与序列df['A']中的元素,那么输出是:?在

Out[2]: 
0    1
1    1

非常感谢!在


Tags: 数据函数in元素df列表fordef
2条回答

另一种方法是使用集合交集来计算大小。理论上讲,这可能比迭代元素要快,因为set是为这类事情而设计的:

df['C'] = df.apply(lambda x: len(set(x.B).intersection(set(x.A.split()))), axis = 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)

给你:

^{pr2}$

那么df2['C']应该给你提到的1,1系列。在

相关问题 更多 >