熊猫比较 2 列,只保留匹配的单词字符串

我正在尝试将 1 个数据帧列中的单词或刺与同一 df 中的另一列进行比较,并输出仅包含匹配单词的第三列。


input

Col1

the cat crossed a road

the dog barked

the chicken barked


Col2

the cat alligator

some words here

chicken soup


desired result

Col3

the cat

NULL

chicken

这就是我所拥有的,但出现错误。


df[Col3] = df[Col1].apply(lambda x: ' '.join([word for word in x.split() if word in x[Col2].split(' ')]))

错误是类型错误:字符串索引必须是整数


慕森王
浏览 130回答 3
3回答

繁花不似锦

使用apply, 和' '.join, 然后使用列表推导来获取匹配的值此外,您必须使用axis=1它才能工作:print(df.apply(lambda x: ' '.join([i for i in x['Col1'].split() if i in x['Col2'].split()]), axis=1))输出:0    the cat1           2    chickendtype: object如果你想要NULL,而不仅仅是一个空值,请使用:print(df.apply(lambda x: ' '.join([i for i in x['Col1'].split() if i in x['Col2'].split()]), axis=1).str.replace('', 'NULL'))输出:0    the cat1    NULL2    chickendtype: object

慕娘9325324

这里不需要使用 lambda 函数,只需检查每个单词是否包含在同一列的字符串中。zip() 函数对于列迭代非常有用。这是一种方法:import pandas as pddata_frame = pd.DataFrame(    {'col1':{        1:'the cat crossed a road',        2:'the dog barked',        3:'the chicken barked',},    'col2':{        1: 'the cat alligator',        2: 'some words here',        3: 'chicken soup'}})# output the overlap as a listoutput = [    [word for word in line1.split() if word in line2.split()]     for line1, line2 in zip(data_frame['col1'].values, data_frame['col2'].values)]# To add your new values a columndata_frame['col3'] = output# Or, if desired, keep as a list and remove empty rows output = [row for row in output if row]

慕哥9229398

检查l=[' '.join([t for t in x if t in y]) for x, y in zip(df1.Col1.str.split(' '),df2.Col2.str.split(' '))]pd.DataFrame({'Col3':l})Out[695]:       Col30  the cat1         2  chicken
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python