Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将一列中的文本映射到另一列中的文本_Python_Regex_Pandas - Fatal编程技术网

Python 将一列中的文本映射到另一列中的文本

Python 将一列中的文本映射到另一列中的文本,python,regex,pandas,Python,Regex,Pandas,我有一个csv,其中有一列包含各种形式的标题。我需要将所有首席执行官、首席运营官、首席运营官、首席运营官等映射到“C级”;副总裁、高级副总裁、副总裁至另一专栏中的“高级副总裁” 我曾尝试用数字映射标题,但未能做到这一点,而且我认为可能有更简单的方法。我还希望在一列中完成所有操作,而不是在映射它们时为C-Level和VP-SVP设置两列 附件是预期结果 我如何解决这个问题 定义一个字典,以便键是您请求的结果,值是一个可能性列表。 my_dict = {"C-LEVEL":['CHIEF',"THE

我有一个csv,其中有一列包含各种形式的标题。我需要将所有首席执行官、首席运营官、首席运营官、首席运营官等映射到“C级”;副总裁、高级副总裁、副总裁至另一专栏中的“高级副总裁”

我曾尝试用数字映射标题,但未能做到这一点,而且我认为可能有更简单的方法。我还希望在一列中完成所有操作,而不是在映射它们时为C-Level和VP-SVP设置两列

附件是预期结果

我如何解决这个问题


定义一个字典,以便键是您请求的结果,值是一个可能性列表。

my_dict = {"C-LEVEL":['CHIEF',"THE CHIEF","MY CHIEF"],"VP-SVP":['VP','PRODUCT VP']}
要使用虚拟数据,请执行以下操作:

df=pd.DataFrame({"A":["CHIEF","MY CHIEF","VP","PRODUCT VP","THE CHIEF", "USER"]})

    A
0   CHIEF
1   MY CHIEF
2   VP
3   PRODUCT VP
4   THE CHIEF
5   USER
创建搜索密钥的函数:

def yourfunc(value):
    for k,v in my_dict.items():
        if value in my_dict.get(k):
            return k
    return "N/A"
最后,使用lambda应用函数:

df['Result'] = df['A'].apply(lambda x: yourfunc(x))
预期结果:

          A       Result
0   CHIEF        C-LEVEL
1   MY CHIEF     C-LEVEL
2   VP           VP-SVP
3   PRODUCT VP   VP-SVP
4   THE CHIEF    C-LEVEL
5   USER         N/A

当您看到“N/A”结果时,您将知道您需要升级词典

您添加了预期的输出,但不是原始数据的样子。我的原始数据是一列标题,正如我在描述中提到的。因此,上图中第一列的6000行是我拥有的数据。嗨,谢谢!它部分起作用。它似乎区分大小写,而且似乎只接受确切的标题。例如,我有一个标题“公司关系副总裁”,但除非完全指定,否则它不会只读取其中的副总裁部分并将其映射到副总裁。你知道怎么做吗?关于区分大小写的问题,你可以添加:df.column1.str.lower()。由于公司关系副总裁不在['ceo'、'首席运营官'、'首席运营官'、'首席运营官'、'首席运营官']中,标签应该是vp svp,正如预期的那样。我认为,但搜索标题的一部分似乎更为复杂。您需要找到将输入映射到输出的一般规则,然后定义一个函数f,如果f(输入),该函数将返回true='c-level'为假,否则为假。然后是np.where(df.column1.apply(f)),'c-level','vp-svp')
          A       Result
0   CHIEF        C-LEVEL
1   MY CHIEF     C-LEVEL
2   VP           VP-SVP
3   PRODUCT VP   VP-SVP
4   THE CHIEF    C-LEVEL
5   USER         N/A