這是我在 Stackoverflow 的第一篇文章,非常感謝您的幫助。我正在嘗試復制一個代碼,我可以在其中將資料幀中的串列與另一個串列匹配,并且如果 dx(診斷)存在于另一個串列中,則它回傳 true。Test 是包含所有 dx 代碼的資料框,而 test['allDX'] 是包含所有 dxcode 串列的列。
import pandas as pd
import numpy as np
#initiate a table
test=pd.DataFrame(np.array([['J123','K63','B45'],['E34','T65','G32'],['R12','T35','K12']]), columns=['Dx1','Dx2','Dx3'])
#create a new column that turns dx1,dx2,dx3 into a list
test['allDx']=test[['Dx1','Dx2','Dx3']].values.tolist()
此代碼有效:
#method 1 using apply, lambda function, works
test['Check']=test.apply(lambda x: pd.Series(x['allDx']).isin(['J123','A','K12','D']).any() , axis=1)
test
Dx1 Dx2 Dx3 allDx Check
0 J123 K63 B45 [J123, K63, B45] True
1 E34 T65 G32 [E34, T65, G32] False
2 R12 T35 K12 [R12, T35, K12] True
可以看到第 0 行、第 1 行回傳 true,因為 J123 存在于第 0 行,而 K12 存在于第 2 行。
但是,這種方法在處理數百萬行時需要很長時間才能運行,所以我考慮使用 np.where,但它沒有回傳結果。
#method 2, using np.where, does not work.
test['Check']=np.where(test['allDx'].isin(['J123','A','K12','D']).any(), 'True','False')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
TypeError: unhashable type: 'list'
The above exception was the direct cause of the following exception:
有沒有辦法使用 np.where 或其他比 lambda 函式更快的方法來執行相同的比較?
謝謝!!
uj5u.com熱心網友回復:
您不需要“allDx”列,只需使用np.isin:
test = pd.DataFrame(np.array([['J123','K63','B45'],
['E34','T65','G32'],
['R12','T35','K12']]),
columns=['Dx1','Dx2','Dx3'])
test["Check"] = np.isin(test.to_numpy(),['J123','A','K12','D']).any(1)
>>> test
Dx1 Dx2 Dx3 Check
0 J123 K63 B45 True
1 E34 T65 G32 False
2 R12 T35 K12 True
uj5u.com熱心網友回復:
如果您沒有具有單個值的列,但只有allDx您可以使用串列理解和set操作,它們應該比apply:
target = ['J123','A','K12','D']
S = set(target)
test["Check"] = [bool(S.intersection(x)) for x in test['allDx']]
替代方案(如果串列很大,可能會更快):
target = ['J123','A','K12','D']
S = set(target)
test["Check"] = [not S.isdisjoint(x) for x in test['allDx']]
輸出:
Dx1 Dx2 Dx3 allDx Check
0 J123 K63 B45 [J123, K63, B45] True
1 E34 T65 G32 [E34, T65, G32] False
2 R12 T35 K12 [R12, T35, K12] True
uj5u.com熱心網友回復:
這也應該有效:
test.assign(Check = test.isin(l).any(axis=1))
輸出:
Dx1 Dx2 Dx3 Check
0 J123K63 B45 True
1 E34 T65 G32 False
2 R12 T35 K12 True
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/471429.html
下一篇:如何根據蒙版為灰度影像著色?
