首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫str.contains匹配不使用regex的精确子字符串

熊猫str.contains匹配不使用regex的精确子字符串
EN

Stack Overflow用户
提问于 2020-04-07 09:59:34
回答 2查看 105关注 0票数 0

我有两个dataframe,并试图找到一种方法来匹配从一个dataframe到另一个dataframe的精确子字符串。

First DataFrame

代码语言:javascript
复制
import pandas as pd
import numpy as np

random_data = {'Place Name':['TS~HOT_MD~h_PB~progra_VV~gogl', 'FM~uiosv_PB~emo_SZ~1x1_TG~bhv'], 
              'Site':['DV360', 'Adikteev']}
        
dataframe = pd.DataFrame(random_data)
print(dataframe)

第二DataFrame

代码语言:javascript
复制
test_data = {'code name': ['PB', 'PB', 'PB'], 
             'Actual':['programmatic me', 'emoteev', 'programmatic-mechanics'],
             'code':['progra', 'emo', 'prog']}

test_dataframe = pd.DataFrame(test_data)

逼近

代码语言:javascript
复制
for k, l, m in zip(test_dataframe.iloc[:, 0], test_dataframe.iloc[:, 1], test_dataframe.iloc[:, 2]):
    dataframe['Site'] = np.select([dataframe['Place Name'].str.contains(r'\b{}~{}\b'.format(k, m), regex=False)], [l],
                                  default=dataframe['Site'])

当前的输出如下所示,尽管我期望匹配精确的子字符串,该子字符串与上面的代码不兼容。

当前产出:

代码语言:javascript
复制
Place Name                        Site
TS~HOT_MD~h_PB~progra_VV~gogl     programmatic-mechanics
FM~uiosv_PB~emo_SZ~1x1_TG~bhv     emoteev

预期产出:

代码语言:javascript
复制
Place Name                        Site
TS~HOT_MD~h_PB~progra_VV~gogl     programmatic me
FM~uiosv_PB~emo_SZ~1x1_TG~bhv     emoteev
EN

回答 2

Stack Overflow用户

发布于 2020-04-07 11:31:52

数据

代码语言:javascript
复制
import pandas as pd
 import numpy as np
 random_data = {'Place Name':['TS~HOT_MD~h_PB~progra_VV~gogl',
                                     'FM~uiosv_PB~emo_SZ~1x1_TG~bhv'], 'Site':['DV360', 'Adikteev']}
    dataframe = pd.DataFrame(random_data)

    test_data = {'code name': ['PB', 'PB', 'PB'], 'Actual':['programmatic me', 'emoteev', 'programmatic-mechanics'],
                 'code':['progra', 'emo', 'prog']}
    test_dataframe  = pd.DataFrame(test_data)

test_datframe codeActual分别映射为keyvalue字典

代码语言:javascript
复制
keys=test_dataframe['code'].values.tolist()

dicto=dict(zip(test_dataframe.code, test_dataframe.Actual))
dicto

加入由|分隔的键,以便搜索任一短语

代码语言:javascript
复制
k = '|'.join(r"{}".format(x) for x in dicto.keys())
k

从数据帧中提取符合k中任何短语的字符串,并将它们映射到字典中。

代码语言:javascript
复制
dataframe['Site'] = dataframe['Place Name'].str.extract('('+ k + ')', expand=False).map(dicto)
dataframe

输出

票数 1
EN

Stack Overflow用户

发布于 2020-04-07 10:52:46

这不是最优雅的解决方案,但这确实有效。

设置数据

代码语言:javascript
复制
import pandas as pd
import numpy as np
random_data = {'Place Name':['TS~HOT_MD~h_PB~progra_VV~gogl',
                                'FM~uiosv_PB~emo_SZ~1x1_TG~bhv'], 'Site':['DV360', 'Adikteev']}

dataframe = pd.DataFrame(random_data)

test_data = {'code name': ['PB', 'PB', 'PB'], 'Actual':['programmatic me', 'emoteev', 'programmatic-mechanics'],
             'code':['progra', 'emo', 'prog']}

test_dataframe = pd.DataFrame(test_data)

解决方案

使用要匹配的子字符串在test_dataframe中创建一个列:

代码语言:javascript
复制
test_dataframe['match_str'] = test_dataframe['code name'] + '~' + test_dataframe.code

print(test_dataframe)
代码语言:javascript
复制
  code name                  Actual    code  match_str
0        PB         programmatic me  progra  PB~progra
1        PB                 emoteev     emo     PB~emo
2        PB  programmatic-mechanics    prog    PB~prog

定义一个应用于test_dataframe的函数

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
                      Place Name             Site
0  TS~HOT_MD~h_PB~progra_VV~gogl  programmatic me
1  FM~uiosv_PB~emo_SZ~1x1_TG~bhv          emoteev
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61077406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档