首页 > 解决方案 > 匹配熊猫系列对象字符串中的确切子字符串

问题描述

我正在尝试匹配 pandas 数据框系列字符串中的确切子字符串,但不知何故str.contains似乎在这里不起作用。我看到了文档,它说应用 regex = False 这也不起作用。任何人都可以提出解决方案吗?

输出:

 Creative Name Revised Targeting Type
0  ff~tg~conbhv             contextual
1  ff~tg~conbhv             contextual
2     ff~tg~con             contextual  

预期输出:

Creative Name Revised Targeting Type
0  ff~tg~conbhv             contextual + behavioral
1  ff~tg~conbhv             contextual + behavioral
2     ff~tg~con             contextual

方法:

import pandas as pd
import numpy as np


column = {'col_name': ['Revised Targeting Type']}

data = {"Creative Name":["ff~pd~q4-smartphones-note10-pdp-iphone7_mk~gb_ch~social_md~h_ad~ss1x1_dt~cross_fm~spost_pb~fcbk_sz~1x1_rt~cpm_tg~conbhv_sa~lo_vv~ia_it~soc_ts~lo-iphone7_ff~ukp q4 smartphones ukc q4 - smartphones - static ukt lo-iphone7 ukcdj buy_ct~fb_cs~1x1_lg~engb_cv~ge_ce~loc_mg~oth_ta~lrn_cw~na",
                         "ff~tg~conbhv",
                         "ff~tg~con"], "Revised Targeting Type":["ABC", "NA", "NA"]}

mapping = {"Code": ['con', 'conbhv'], "Actual": ['contextual', 'contextual + behavioral'], "OtherPV": [np.nan, np.nan],
           "SheetName": ['tg', 'tg']}

# Creating a dataFrame
dataframe_data = pd.DataFrame(data)
mapping_data = pd.DataFrame(mapping)
column_data = pd.DataFrame(column)

print(dataframe_data)

print(mapping_data)

print(column_data)

# loop through Dataframe column avilable in (column_data) dataframe
for i in column_data.iloc[:,0]:
    print(i)
    # loop through mapping dataframe (mapping_data)
    for k, l, m in zip(mapping_data.iloc[:, 0], mapping_data.iloc[:, 1], mapping_data.iloc[:, 3]):
        # mask the dataframe (dataframe_date)
        mask_null_revised_new_col = (dataframe_data['{}'.format(i)].isin(['NA']))
       #apply dataframe values in main dataframe (dataframe_data)
        dataframe_data['{}'.format(i)] = np.select([mask_null_revised_new_col &
                                                    dataframe_data['Creative Name'].str.contains('{}~{}'.format(m, k))],
                                                   [l], default=dataframe_data['{}'.format(i)])

print(dataframe_data)

Creative Name Revised Targeting Type
0  ff~tg~conbhv             contextual
1  ff~tg~conbhv             contextual
2     ff~tg~con             contextual  

标签: pythonpandas

解决方案


老实说,我对你的问题有点困惑,但这是你要找的吗?

dataframe_data['Revised Targeting Type'] = np.where(dataframe_data['Creative Name'].str.contains('.*conbhv*', regex = True), 'contextual + behavioral', 'contextual')

推荐阅读