是的:我必须在一系列序列中循环查找是否有任何序列值包含子集字符串“ Hi”?
解释:这里有两个数据框Dataframe1和Dataframe2,我试图查找Dataframe2的“源代码”是否包含Dataframe1的字符串,然后在Dataframe3中设置结果。
import pandas as pd
import numpy as np
import openpyxl
data = {'Fields' : ['Hi', 'How', 'Are', 'You']}
Dataframe1 = pd.DataFrame(data)
data2 = {'SourceCode' : ['LMNOHiPQR', 'LMNOHowPQR'']}
Dataframe2 = pd.DataFrame(data2)
data3 = {'dummy' : []}
Dataframe3 = pd.DataFrame(data3)
for i in range(0,len(Dataframe1)):
current_string=Dataframe1['Fields'][i]
for j in range(0,len(Dataframe2)):
if Dataframe2['SourceCode'].iloc[j].contains(current_field):
Dataframe3['dummy'].iloc[j] =Dataframe2['SourceCode'].iloc[j]
期望:我希望包含来自Dataframe1的字符串的'SourceCode'值在Dataframe3中设置。但出现以下错误。
RESULT:
if Dataframe2['SourceCode'].iloc[j].contains(current_field):
AttributeError: 'str' object has no attribute 'contains'
答案 0 :(得分:0)
IIUC,您应该使用in
运算符来测试字符串中是否存在子字符串,因此您的循环应该类似于:
for i in range(0,len(Dataframe1)):
current_string=Dataframe1['Fields'][i]
for j in range(0,len(Dataframe2)):
if current_string in Dataframe2['SourceCode'].iloc[j]:
Dataframe3.loc[j, 'dummy'] = Dataframe2['SourceCode'].iloc[j]
但是,不建议使用pandas.DataFrames
循环。因此,另一种解决方案可能是使用Series.str.contains
方法和boolean indexing
:
Dataframe3 = Dataframe2[Dataframe2.SourceCode.str.contains('|'.join(Dataframe1.Fields))]
[出]
SourceCode
0 try{string s = "Hi"}catch { }return null;
1 try{string s = "How"}catch { }return null;
如果您要求匹配项包含单词边界,请先创建您的正则表达式模式,例如:
pat = r'\b' + r'\b|\b'.join(Dataframe1.Fields) + r'\b'
Dataframe3 = Dataframe2[Dataframe2.SourceCode.str.contains(pat)]