我有DF1
和一个DF2
,我想在左侧(在['text']
列上)合并
DF2['text']
的某些字符串是DF1['text']
的子字符串。
我尝试使用双循环进行脏循环,但是DF1
大约有20万行,DF2
大约有2k行,因此时间似乎很长(最好的情况)
DF1
id text
1 'some text with details'
2 'which are not always good'
3 'irrelevant text'
4 'I want to get rid of them'
5 'more irrelevant cells'
DF2
id text tag
1 'with details' 'Good'
2 'which are not' 'Bad'
3 'to get rid of' 'semiGood'
for i in range(len(DF2)):
for k in range(len(DF1)):
if DF2['text'][i] in DF2['text'][k]:
DF1.loc[:,'tag'].iloc[k] = DF2['tag'][i]
预期输出:
DF1
id text tag
1 'some text with details' 'Good'
2 'which are not always good' 'Bad'
3 'irrelevant text'
4 'I want to get rid of them' 'semiGood'
5 'more irrelevant cells'
我很想找到一种方法,可以在不到5天的时间内完成双循环。有东西吗?
答案 0 :(得分:0)
我认为我的方法有点复杂。如果可以找到,您可以尝试其他技术。这是我的方法:
首先,我将text
和DF1
的{{1}}列中的每个单词分开:
DF2
然后,我将splitDF1, splitDF2 = [],[]
for i,tt1 in enumerate(DF1['text']):
splitDF1.append([i,tt1.split()])
for i,tt2 in enumerate(DF2['text']):
splitDF2.append([i,tt2.split()])
中的拆分文本列表与DF1
中的拆分文本列表进行比较。如果DF2
中的拆分文本是DF2
中拆分文本的子集,请将DF2
存储到新列表中,否则将其保留为空。最后,使用新列表将新列tag
添加到tag
中。
DF1
输出:
DF1tag = []
for sdf1 in splitDF1:
for sdf2 in splitDF2:
if set(sdf2[1]).issubset(sdf1[1]):
tag = DF2.iloc[sdf2[0]][2]
break
else:
tag = ""
DF1tag.append(tag)
DF1['tag'] = DF1tag