用正则表达式|(或)替换Python字符串

2024-10-06 18:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧:

df_bisID = pd.DataFrame({'A': ['ID1#ID2', 'ID3#ID4'],
                         'B': ['ID5#ID6', 'ID7#ID8'],
                         'C': ['ID9#ID10', 'ID11#ID12'],
                         'D': ['ID13#ID14', 'ID15#ID16']})

    A       B       C           D
0   ID1#ID2 ID5#ID6 ID9#ID10    ID13#ID14
1   ID3#ID4 ID7#ID8 ID11#ID12   ID15#ID16


df_eliminateID = pd.DataFrame({'A': ['ID1', 'ID3', 'ID9', 'ID11'],
                               'B': ['ID5', 'ID7', 'ID13', 'ID15']})

    A    B
0   ID1  ID5
1   ID3  ID7
2   ID9  ID13
3   ID11 ID15

ID很复杂,带有字母数字和唯一性('xxxx-xxxxxxxxx-xxx'+兼性后缀'-xxx-xxx')。我提出了一个简化ID的示例

在df_bisID中,我需要在每一列中去掉ID和#中的一个,它分别包含在df_eliminateID中的A列或B列中

所以我想用“ID2”替换“ID1#ID2”,用“ID10”替换“ID9#ID10”,等等

请注意,它也可以是“ID2#ID1”而不是“ID1#ID2”,这会使替换条件复杂化,这也是问题字符串替换的原因

我的问题的合理解决方案是:

for i in df_eliminateID['A']:
    df_bisID.replace(i+'#|#'+i, '')
for i in df_eliminateID['B']:
    df_bisID.replace(i+'#|#'+i, '')

但最后,我的df#u bisID是空的,这就是为什么我请求您帮助在字符串替换中使用| regex,我想用“”替换IDX#或#IDX,以仅保留一个id。 OR在regex中,可能我没有正确使用它(regex中是否有exclusif OR?)

首先,谢谢你的帮助

编辑:找到解决方案

我必须将数据帧中的一些“u”替换为“-”

df.replace('_', '-', regex=True)

如果regex=False,它不起作用,我不明白确切的原因(如果有人能给我解释一下,那会很酷,我在文档中搜索了一下,但在理解方面没有任何收获)

所以我决定测试它是否能解决这个问题:

dfbis = pd.DataFrame({'A': ['ID1#ID2', 'ID3#ID4'],
                      'B': ['ID5#ID6', 'ID7#ID8'],
                      'C': ['ID9#ID20', 'ID21#ID22'],
                      'D': ['ID23#ID24', 'ID25#ID26']})
    A       B       C           D
0   ID1#ID2 ID5#ID6 ID9#ID20  ID23#ID24
1   ID3#ID4 ID7#ID8 ID21#ID22 ID25#ID26

dfdetermine = pd.DataFrame({'A': ['ID1', 'ID3', 'ID20', 'ID22'],
                            'B': ['ID5', 'ID7', 'ID23', 'ID25']})

    A    B
0   ID1  ID5
1   ID3  ID7
2   ID20 ID23
3   ID22 ID25

for i in dfdetermine['A'], dfdetermine['B']:
    print(i)
    dfbis = dfbis.replace(i+'#', '', regex=True).replace('#'+i, '', regex=True)

dfbis

    A   B   C    D
0   ID2 ID6 ID9  ID24
1   ID4 ID8 ID21 ID26

我将ID10+改为ID20+,如果不是的话,ID1测试会干扰结果

此外,我还发现了一些关于字符串替换计时的信息,这些信息启发我将IDX和IDX替换放入对df.replace:https://qastack.fr/programming/3411771/best-way-to-replace-multiple-characters-in-a-string的两个调用中

你认为我的计划可以优化吗


Tags: dfreplaceregexid3id2id1id4id7
2条回答

我强烈建议检查pandas对象可用的字符串操作,特别是str.replace函数,我认为这正是您在这里想要的:

for i in df_eliminateID['A']:    
    df_bisID = df_bisID.str.replace(f'{i}#|#{i}', '')
for i in df_eliminateID['B']:
    df_bisID = df_bisID.str.replace(f'{i}#|#{i}', '')

您可以重新编写列索引stack,删除字符串的尾部和unstack

(df_bisID.set_axis(pd.MultiIndex.from_product([[0,1],
                                               df_bisID.columns[:2]]),
                   axis=1)
         .stack(level=[0,1])
         .str.split('#').str[0]
         .unstack()
         .reset_index(drop=True)
) 

输出:

      A     B
0   ID1   ID5
1   ID9  ID13
2   ID3   ID7
3  ID11  ID15

相关问题 更多 >