Python pandas str.contains match-exact子字符串不适用于正则表达式boudry
我有两个数据帧,并试图找到一种方法来匹配从一个数据帧到另一个数据帧的确切子字符串 第一个数据帧:Python pandas str.contains match-exact子字符串不适用于正则表达式boudry,python,pandas,numpy,Python,Pandas,Numpy,我有两个数据帧,并试图找到一种方法来匹配从一个数据帧到另一个数据帧的确切子字符串 第一个数据帧: 将熊猫作为pd导入 将numpy作为np导入 随机数据={'Place Name':['TS~HOT_MD~h_PB~progra_VV~gogl','FM~uiosv_PB~emo_SZ~1x1_TG~bhv'], 'Site':['DV360','Adikteev']} dataframe=pd.dataframe(随机数据) 打印(数据帧) 第二个数据帧 test_data={'code n
将熊猫作为pd导入
将numpy作为np导入
随机数据={'Place Name':['TS~HOT_MD~h_PB~progra_VV~gogl','FM~uiosv_PB~emo_SZ~1x1_TG~bhv'],
'Site':['DV360','Adikteev']}
dataframe=pd.dataframe(随机数据)
打印(数据帧)
第二个数据帧
test_data={'code name':['PB','PB','PB'],
“实际”:[“编程me”、“Emotev”、“编程机制”],
'代码':['progra','emo','prog']}
测试数据帧=局部数据帧(测试数据)
方法
zip中的k、l、m(test_dataframe.iloc[:,0],test_dataframe.iloc[:,1],test_dataframe.iloc[:,2]):
dataframe['Site']=np.select([dataframe['placename'].str.contains(r'\b{}~{}\b'.format(k,m),regex=False)],[l],
默认值=数据帧['Site'])
当前输出如下所示,尽管我希望匹配精确的子字符串,但它不适用于上面的代码
电流输出:
地名站点
TS~HOT_MD~h_PB~progra_VV~gogl编程力学
FM~uiosv_PB~emo_SZ~1x1_TG~bhv emotev
预期产出:
地名站点
TS~HOT_MD~h_PB~progra_VV~gogl编程me
FM~uiosv_PB~emo_SZ~1x1_TG~bhv emotev
不是最优雅的解决方案,但这确实起到了作用
设置数据
解决方案
在test_dataframe
中创建一列,其中包含要匹配的子字符串:
test_dataframe['match_str'] = test_dataframe['code name'] + '~' + test_dataframe.code
print(test_dataframe)
定义要应用于测试数据帧的函数:
def match_string(row, dataframe):
ind = row.name
try:
if row[-1] in dataframe.loc[ind, 'Place Name']:
return row[1]
else:
return dataframe.loc[ind, 'Site']
except KeyError:
# More rows in test_dataframe than there are in dataframe
pass
# Apply match_string and assign back to dataframe
dataframe['Site'] = test_dataframe.apply(match_string, args=(dataframe,), axis=1)
输出:
Place Name Site
0 TS~HOT_MD~h_PB~progra_VV~gogl programmatic me
1 FM~uiosv_PB~emo_SZ~1x1_TG~bhv emoteev
资料
将测试数据框
代码
和实际
分别映射为键
和值
keys=test_dataframe['code'].values.tolist()
dicto=dict(zip(test_dataframe.code, test_dataframe.Actual))
dicto
连接由分隔的键以启用搜索任一短语
k = '|'.join(r"{}".format(x) for x in dicto.keys())
k
从符合k中任何短语的datframe中提取字符串,并将其映射到字典
dataframe['Site'] = dataframe['Place Name'].str.extract('('+ k + ')', expand=False).map(dicto)
dataframe
输出
是否有一种使用正则表达式模式的方法与使用NumPy、pandas的方法相同?是的,
pandas
有多种正则表达式方法,例如分别对应于re.match
和re.search
的str.contains
和str.contains似乎不起作用。尝试str.match。但是,我发布的“解决方案”并没有给出您想要的结果。据我所知,我已经重新创建了您想要的逻辑(我可能误解了),并且使用了您提供的数据(谢谢!),因此我不确定为什么在输出的第二行中会出现emotev
。排序后,我将完全理解问题的逻辑,并能更好地帮助修改答案以使用正则表达式。如果str.contains
不起作用,则str.match
将不起作用,因为后者只是更严格的版本,或者前者(即,它只在字符串开头而不是整个字符串中查找模式)。我收到错误,AttributeError:“DataFrame”对象没有属性“map”,您正在运行哪个版本的熊猫。我已经在两台机器上运行了它,一台是0.25,另一台是1.0.1。一切都好。请参见我的回答中附加的屏幕截图,如pd>>>pd.\uuuu版本\uuuuu'1.0.3'抱歉,我忘记在回答中复制keys=test\u dataframe['code'].values.tolist()sent@MishD你怎么去的?
keys=test_dataframe['code'].values.tolist()
dicto=dict(zip(test_dataframe.code, test_dataframe.Actual))
dicto
k = '|'.join(r"{}".format(x) for x in dicto.keys())
k
dataframe['Site'] = dataframe['Place Name'].str.extract('('+ k + ')', expand=False).map(dicto)
dataframe