我有以下数据帧:
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
非常感谢!在
另一种方法是使用集合交集来计算大小。理论上讲,这可能比迭代元素要快,因为
set
是为这类事情而设计的:你必须在另一个轴上
apply
。在给你:
^{pr2}$那么df2['C']应该给你提到的1,1系列。在
相关问题 更多 >
编程相关推荐