我有 2 個資料框:
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-xxxxxxxxxx-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_bisID 是空的,這就是為什么我請你幫忙使用 | regex 在我的字串替換中,我想用 '' 替換 IDX# 或 #IDX 以僅保留其中一個 ID。手術室是 | 在正則運算式中,也許我沒有以正確的方式使用它(是否有排除或在正則運算式中?)
在此先感謝您的幫助。
編輯:找到解決方案!
我不得不將之前在我的資料框中的一些“_”替換為“-”
df.replace('_', '-', regex=True)
如果正則運算式 = 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 替換放入 2 次呼叫 df.replace 中:https ://qastack.fr/programming/3411771/best-way-to-replace-字串中的多個字符
你認為我的程式可以優化嗎?
uj5u.com熱心網友回復:
我強烈建議查看可用于 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}', '')
uj5u.com熱心網友回復:
您可以重新處理您的列索引,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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326793.html
