我有两个数据帧:
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的两个调用中
你认为我的计划可以优化吗
我强烈建议检查pandas对象可用的字符串操作,特别是str.replace函数,我认为这正是您在这里想要的:
您可以重新编写列索引
stack
,删除字符串的尾部和unstack
:输出:
相关问题 更多 >
编程相关推荐