加速交叉参考滤波

2024-05-23 14:50:01 发布

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

我正在使用一个非常大的捐赠数据库,其中包含捐赠ID、管道ID、金额等相关列的数据,例如:

  TRANSACTION_ID BACK_REFERENCE_TRAN_ID_NUMBER  CONTRIBUTION_AMOUNT
0    VR0P4H2SEZ1                             0                  100
1    VR0P4H3X770                             0                 2700
2    VR0P4GY6QV1                             0                  500
3    VR0P4H3X720                             0                 1700
4    VR0P4GYHHA0                  VR0P4GYHHA0E                  200

我需要做的是识别所有的行,其中事务ID对应于任何BACK\u REFERENCE\u TRAN\u ID\u编号。我目前的代码,虽然有点笨拙,是:

is_from_conduit = df[df.BACK_REFERENCE_TRAN_ID_NUMBER != "0"].BACK_REFERENCE_TRAN_ID_NUMBER.tolist()
df['CONDUIT_FOR_OTHER_DONATION'] = 0
for row in df.index:
    if df['TRANSACTION_ID'][row] in is_from_conduit:
        df['CONDUIT_FOR_OTHER_DONATION'][row] = 1
    else:
        df['CONDUIT_FOR_OTHER_DONATION'][row] = 0

然而,在拥有大量管道捐赠的非常大的数据集上,这需要永远的时间。我知道一定有更简单的方法,但显然我想不出如何表达这一点来找出可能是什么。你知道吗


Tags: 数据idnumberdffor管道isdonation
2条回答

您可以使用^{}。它是一个向量化操作,用于检查序列中的每个元素是否在提供的iterable中。你知道吗

df['CONDUIT_FOR_OTHER_DONATION'] = df['TRANSACTION_ID'].isin(df['BACK_REFERENCE_TRAN_ID_NUMBER'].unique())

如@root所述,如果您喜欢0/1(如您的示例中所示)而不是True/False,您可以强制转换为int

df['CONDUIT_FOR_OTHER_DONATION'] = df['TRANSACTION_ID'].isin(df['BACK_REFERENCE_TRAN_ID_NUMBER'].unique()).astype(int)

下面是一个基于NumPy的方法,使用^{}-

vals = np.in1d(df.TRANSACTION_ID,df.BACK_REFERENCE_TRAN_ID_NUMBER).astype(int)
df['CONDUIT_FOR_OTHER_DONATION'] = vals

相关问题 更多 >