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

时间:2015-11-02 00:01:59

标签: python pandas dataframe apply

我有以下数据框:

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']的元素显然是一个列表,而不是一个字符串(它又是列表的元素)。 / p>

所以我得到了:

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 ['A']系列中的元素检查,每个数据帧行,系列df ['B']的元素,因此输出为:?

Out[2]: 
0    1
1    1

非常感谢!

2 个答案:

答案 0 :(得分: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 [&#39; C&#39;]会给你你提到的1,1系列。

答案 1 :(得分:2)

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

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