加快Pandas DB中的交叉引用过滤

wha*_*iam 4 python performance pandas

我正在使用一个非常大的数据捐赠数据库,其中包含捐赠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
Run Code Online (Sandbox Code Playgroud)

我需要做的是识别TRANSACTION_ID对应于任何BACK_REFERENCE_TRAN_ID_NUMBER的所有行.我目前的代码,虽然有点笨拙,但是:

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
Run Code Online (Sandbox Code Playgroud)

然而,对于拥有大量管道捐赠的非常大的数据集,这需要永远.我知道必须有一个更简单的方法,但很明显我无法想出如何用这句话来找出可能的内容.

Ale*_*lex 5

你可以用Series.isin.它是一个向量化操作,用于检查Series的每个元素是否都在提供的可迭代中.

df['CONDUIT_FOR_OTHER_DONATION'] = df['TRANSACTION_ID'].isin(df['BACK_REFERENCE_TRAN_ID_NUMBER'].unique())
Run Code Online (Sandbox Code Playgroud)

正如@root所提到的,如果您更喜欢0/ 1(如在您的示例中)而不是True/ False,您可以转换为int:

df['CONDUIT_FOR_OTHER_DONATION'] = df['TRANSACTION_ID'].isin(df['BACK_REFERENCE_TRAN_ID_NUMBER'].unique()).astype(int)
Run Code Online (Sandbox Code Playgroud)