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