我有以下数据框:
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
非常感谢!
答案 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)